Go学习第一天:基础知识与实战 | 青训营笔记

19 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

通过今天的两节视频课,对Go语言的基础知识进行了学习并依照视频完成了猜谜游戏(猜数字)、在线词典、socks5代理服务三个示例项目。

第一节课:Go基础知识学习

本节课主要介绍了Go的特性与Go的语法知识

Go特性

  • 语法简单,易于上手
  • 作为静态语言,性能更高,原生支持高并发
  • 相较于C/C++支持垃圾回收且支持快速的增量编译
  • 有丰富标准库与工具链完备
  • 支持跨平台

Go语法知识

switch-case

Go中switch-case中进入到case中执行完成后自动break

切片

切片本质上是变长数组,实际占用的空间会随着数据量增加而增加,占用空间不足时会重新分配空间

s := make([]string,3)
s = append(s, "a") // 这里需要给s赋值的原因为:s为动态数组,s可视作一个指针,当重新分配空间时地址会发生变化,应该将变化后的地址赋值给s

map

Go中map为hashmap,键值对随机排布,不能以key或者value值顺序遍历

函数

Go中函数支持多返回值且接收返回值时可通过下滑线作为占位符

func exists(m map[string]string, k string) (v string, ok bool) {
    v, ok = m[k]
    return v, ok
}
_, ok := exists(m,k)

第二节课:Go项目实战

本节课实现了猜数字、在线词典、SOCKS5代理三个示例项目

1. 猜谜游戏(猜数字)

  • 获取当前时间生成随机种子
rand.Seed(time.Now().UnixNano()) // 根据当前时间生成随机种子
  • go的从标准输入流读取信息并转化为整形
reader := bufio.NewReader(os.Stdin) // 获取标准流Reader
input, err := reader.ReadString('\n') // 读字符串
input = strings.Trim(input, "\r\n") // 去掉字符串冗余部分
guess, err := strconv.Atoi(input) // 字符串转整形

2. 在线词典

获取在线翻译网站的请求信息

使用浏览器抓包并获取请求信息,通过在线工具转换为Go代码

Convert curl to Go (curlconverter.com)

相应信息结构体生成

使用在线工具根据请求响应的json信息生成Go中的结构体,便于对相应信息进行解析

JSON转Golang Struct - 在线工具 - OKTools

3. SOCKS5代理

通过本示例,对SOCK5协议有了基本的了解,学习了如何用Go创建监听端口,读取网络包数据和数据的转发

运行逻辑

  1. 监听本地端口
  2. 认证SOCKS5协议
  3. 验证数据包类型,根据类型输出域名与端口等连接信息
  4. 数据的双向转发