这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记。
golang基础
- 文档链接:pkg.go.dev/std
- go tool in vs code下载失败: goproxy.cn/
-
go用切片比较多,很少用数组。可以用append扩容,但是因为自动扩容到2 * cap(slice) 长度,所以建议make([]int, 0, capValue) 准备一块内存, capValue 需要自己估计下, 尽可能确保足够用就好。
-
go用switch不需要用break退出,go只有for循环。
-
:=只能在函数内部使用,如果声明全局变量需要使用var关键字。
-
value type:传参时需要考虑pointer,reference type:传参时不需要考虑pointer。我觉得字节课程没讲,其实不是所有的receiver都需要传指针才能改变值。
-
打印字段的格式:
-
结构体首字母全部大写就可以用
json.Marshal做序列化,直接打印只会展示十六进制编码。用json.unmarshal反序列化。 -
time.now()得到当前时间。(其实我觉得需要用的时候再看文档就够了,反正记不住。 -
数字解析可以用stronv的库。
- 字符串拼接优化问题,对于字符串长度不一的用
string.builder最优,但是字符串长度一致下编译器会对+进行优化,更优。
- 留意一下内核态copy。(Q&A的提问,说后面会讲)
以下所有代码都可以在这里看到:github.com/wangkechun/…
猜谜游戏
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secrectNumber := rand.Intn(maxNum)
for {
reader := bufio.NewReader(os.Stdin)
// 换行符作为输入结束符,得到input
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("error!")
return
}
// 去掉换行符
input = strings.TrimSuffix(input, "\n")
// 利用之前说的数字解析,把字符串换成数字
guessNumber, err := strconv.Atoi(input)
if err != nil {
fmt.Println("error!")
return
}
if guessNumber > secrectNumber {
fmt.Println("too high")
} else if guessNumber < secrectNumber {
fmt.Println("too low")
} else {
fmt.Println("equal")
break
}
}
}
代码生成
- 网络请求代码(网页有使用说明): curlconverter.com/#go
- 网络response解析代码(网页有使用说明):oktools.net/json2go
socks5 代理
- go 开一个routine比其他语言开一个子线程消耗少很多,做大规模网络请求压力少很多。
- defer函数和swift的defer用法一样,都是func退出的时候做一件事情。
- bufio是待缓冲流,
reader.ReaderByte效率很低需要优化。 github.com/wangkechun/…
标题:用户9006321693578 的个人主页 - 动态 - 掘金