Go 语言上手-基础语言 | 青训营笔记

120 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第0篇笔记

Go优秀的特点

  1. 标准库丰富
  2. 工具齐全(格式化、测试等)
  3. 静态链接,不需要大的运行时
  4. 不用配置交叉编译

Go的基本语法

其实基本语法我了解过的。这里主要介绍一些我觉得需要提醒自己的点吧:

  1. 使用指针避免传递大结构体开销
  2. 结构体方法带指针和不带指针怎么选择?带指针可以修改结构体。
  3. 字符串操作?看下面这个。需要注意的就是中文字符串,len返回的是字节数。

截屏2022-05-06 下午11.56.37.png 4. 格式化操作?你可以用%v打印任何值。用+和#控制详细程度。

截屏2022-05-06 下午11.58.34.png

  1. 想要json化一个对象? 只要让结构体的字段大写即可。如果需要指定转换后的字段名,加个tag即可。

  2. 想要时间格式包?也很轻松。唯一恶心的就是2006.

截屏2022-05-07 上午12.01.32.png

  1. 想要parse字符串成整数?只需要strconv.parseInt(str, 进制(通常是10), 位宽(通常64))即可。

  2. 想要调用ls grep mkdir?很简单!

截屏2022-05-07 上午12.05.08.png

项目实战

项目1是猜谜游戏。这个没什么好说的,学过编程都会写。需要注意的就是bufio.newReader()这种方法来读输入比较麻烦,要指定system.in,还要输入分隔符。

项目2比较有意思。教你如何发一个http请求。这里会用到一些结构体定义、json序列化、http包的用法。又一个很有收获的点是,你可以copy一个开发者工具里的请求,并把它转成curl。

然后,可以利用curl命令做代码生成。地址是这个。 它可以把curl命令转成代码。几乎可以不加修改(需要去掉一些转义字符)的贴到本地运行。而老师也单独的解释了为什么post request的表单入参data是一个reader,这是因为请求的参数可能很大,如果是别的类型可能占用很大的内存。流的话可以一次读取一点。

同理,响应也是流。

继续往下看,学到了另一个好用的生成器,可以把json转换成Golang对象。链接是这个

项目3更厉害,讲的是如何实现一个socks5代理服务器。事实上我之前完全不了解代理服务器,可以看到go确实擅长干一些很酷的事。

socks5协议示意图如下:

截屏2022-05-07 上午12.38.24.png

第一阶段是协商,这里主要协商如何鉴权。 第二阶段是请求阶段。这一部分是代理服务器去解析请求,得知之后要建立连接的ip 端口号。 第三阶段是relay阶段。与上一阶段得到的ip+port建立连接。

实现echo server的具体代码可以看proxy/v1 虽然我已经写过echo server了,但还是感叹go的力量。用net.listen可以轻松的监听。之后,每个请求都要go routine来处理即可。可以轻松处理上万的并发,太酷了。

同时还学到了可以用nc命令建立本地连接。

第二阶段的话其实就是按照协议格式一点点读字节。比较重要的一点是给新人打开一扇大门,让他们知道如何利用网络去编程序。

第三阶段用到了context和cancel。这里很少用,还不是特别会。

总的来说,感觉收获还是很大的!