Go语言基础|青训营笔记

47 阅读2分钟

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

个人认为比较新鲜或重要的点

1.go语言特性defer

在函数return返回前,按从下往上的顺序执行。我认为这个特性非常方便实用,比如,在业务代码中可以用来写一个兜底的返回,执行一些必要的操作和处理。某些方法可能中途有很多判断的点会提前return,尤其是代码很长的时候。为防止代码中途退出而导致某些重要处理没有执行,或者某些重要变量没有赋值导致上游或下游出错,可以在函数开始或前面部分defer做一个兜底之类的操作。

之前就遇到过一次bug。某个函数很长时间没有拆分重构,越写越长,其中有很多判断和return的操作。而有一次需求对这部分代码进行了修改,函数符合预期正常在中间退出,但response中某个不太起眼的变量没有赋值返回空值导致上游报错。最后修复的时候,就是使用defer写了兜底。

2.struct与json

type userInfo struct {
   Name  string
   Age   int `json:"age"`
   Hobby []string
}

go的json包也十分方便,定义一个结构体,可以用 json.Marshal( ) 把结构体转换成json格式,用 json.Unmarshal( )来将json解析,可以很方便的构造或者解析请求和回复。 定义结构体时在变量类型后加上 'json:"NAME"' 则在json内用NAME来代替原变量名

3.printf

fmt.Printf("p=%v\n", p)  // p={1 2}
fmt.Printf("p=%+v\n", p) // p={x:1 y:2}
fmt.Printf("p=%#v\n", p) // p=main.point{x:1, y:2}

看起来类似C++中的printf,但是感觉更加方便,只需要用 %v 就可以代表变量,而不用像 %d 代表整数,%s代表字符串这样。另外使用 %+v 可以输出变量名和值,%#v 输出详细信息,也十分方便。

此外还初步了解了socks5协议,包括其默认端口是1080,信息是明文传输,工作流程等。