这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
今天由字节跳动的王克纯老师介绍了 Go 语言的语言基础,并且通过几个 demo 演示了一些简单的项目场景。
本人之前学过 Go 的基础语法,对于并发编程、网络编程等也有一些其他语言上的经验,所以只记录自己觉得有收获的点。
视频中讲到了 Go 语言只使用标准库就可以进行高性能并发编程,既然企业里的人都这么说,干脆就把这点当结论来用吧。之前查过 goroutinue 的底层实现,发现并不是单纯的线程或协程。大概是用多线程利用多核资源,线程内使用协程减少切换开销,并且使用很多调度的技巧对用户屏蔽了这些细节,同时使整体效率最高。
之后讲变量常量的时候讲到 Go 的常量没有确定类型,会根据使用上下文自动确定类型?开始听到有点不解,查了一下是这样的:首先常量声明时是可以指定类型的,这种就是类型确定的;但是对于没有指定类型的常量,如 const Pi = 3.14159265358979633846264 这种就属于无类型常量,一方面可以根据某次调用的上下文确定为 float32 或 float64 中的某一种,另一方面 Go 为这种无类型的常量提供了更高的运算精度(大约有 256 bit 精度?),可以记录更高精度的数据。
switch 语句可以不写选择什么变量,而是直接在 case 后判断,用来替代多次 if-else if 分支,这点主要是以前没想过是这么用的:
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("before noon")
default:
fmt.Println("after noon")
}
创建结构体函数时如果用结构体指针作为对象可以修改这个结构体的内容,这一点区别于传入形参的结构体函数。
结构体定义后加 json tag 可以用来修改结构体序列化后的字段名称,这点之前查过一些资料,没有人提到这个注解是干啥的,能看出来这个课虽然密度很大,但是讲的还是很细的:
type userInfo struct {
Name string,
Age int `json:"age"`
}
调用 json.Marshal 后得到 {"Name": "111", "age": 22}
项目实战中讲到了一个生成请求的技巧。在浏览器控制台将对应请求复制为 cURL,然后使用工具网站curlconverter.com 可以直接转化成对应语言下生成请求的代码,中间可能会有有一些小错误,但是依旧能帮助我们省下很多构建请求头的功夫。
在处理返回结果时,由于 Go 是强类型语言,所以最好应该设置一个专门的结构体和返回结果对应,但是由于这个返回的json可能很复杂,所以可以用 oktools.net/json2go 这样的工具来解决。
最后讲解了一个基本的 Socks5 代理服务器实现,主要流程是先和客户端请求进行握手,之后将客户端发送的请求转发到指定的目标地址,再把返回数据转发回客户端,还是挺有意思的。具体的代码实现可参考 go-by-example/main.go at master · wangkechun/go-by-example (github.com)