Go语言
编程细节
- type 相关的定义可以抽到 xxx/types 的目录下,好处是可以避免循环引用
- client 尽量复用,防止开了很多个客户端没有关闭导致 goroutine 数量暴涨
- json.rawMessage 适用于根据情况如 type 来解结构体的情况
- 结构体作为数据库 Model 时字段要大写,并且要与数据库中对应字段一致
- 方便单测的编程技巧 https://juejin.im/post/5ce93447e51d45775746b8b0
工具
go-lint
基础
基础数据结构
String
string是不可变的,不能更改,故两个副本共享string的内存是安全的,s[:n]的代价也很低
编码
UTF-8 通过第一个字节开头的1来标示需要用到多少个字节
Strings bytes strconv unicode 包提供处理字符串的函数
string 操作开销较大,可以使用 bytes.Buffer
复杂类型
Arrays
数组相当于一个固定量而非指针,所以复制传值的开销过大,切片就是解决方案
Slice
https://halfrost.com/go_slice/
Maps
函数
Panic 和 Recover
Panic 会依次(先进先出)调用本协程的 defer() 后退出程序
Recover 会捕捉处理 panic,可以处理本协程的 panic,保证程序不会挂掉
函数引用
函数参数为值的时候传值和传指针都可以,因为 go 会将指针转换为值
Goroutines 和 Channels
异步(有缓冲区)的 Channel 用完要 close,不然会阻塞,形成死锁