golang的一些最佳实践

1.go里面一个goroutine panic了, 会导致进程退出, 所以go func()时第一行带上defer
2.go里面 []byte和string互转是会发生复制的, 开销明显, 如果代码里频繁互转, 考虑使用bytes.buffer 和 sync.Pool
3.在写http api时, parse body这种事情, 如果只是纯粹取body里的json数据, 没必要单独定义结构体, 在函数里定义一个匿名结构体就好
4.同步化的goroutine一不小心就没有退出, 如果你写一个长期运行的服务, 用logger记录每一个goroutine的清理退出, 防止goroutine泄露
5.select语句是会跳过nil的channels的. 因为在Go里往已经close掉的channel里发送数据是会panic的, 可以利用select语句.
附: channel操作导致panic的情况有: 关闭一个nil的channel, 关闭一个已经关闭的channel( j,ok:= <- ch, ok为false时代表ch已经关闭了), 往一个已经关闭的channel里发送数据(从已经关闭的channel里读数据是OK的, 如果这个channel是带缓冲的, 那么可以读到所有数据)
6.在go里, goroutines之间通信不要用共享内存的方式实现, 应该用channel来实现
7.并发不是并行
8.channel是编排, mutexs是串行
9.interface定义越多的方法, 抽象程度越低. Go提倡用接口组合的方式实现更大的接口
10.零值, 猜测这里说的是struct{}吧, struct{}是一个不占内存的空结构体, 在用map实现set, channel发送无额外意义的signal时能降低内存分配
11.提倡gofmt
12.一点点复制比一点点依赖好. 官方包里有时能见到一些复制的代码, 这是为了不互相依赖
13.简洁胜过高效
14.error是值 可以用值的方式去处理错误: 传递, 比较
15.不用仅检查错误, 要优雅地处理
16.多花精力设计架构, 模块命名, 写详细的文档
17.写良好的文档给用户
18.对于普通错误, 应该用多值返回错误, 而不是手动panic
19.make只用于slice、map以及channel的初始化(非零值);而new用于类型的内存分配,并且内存置为零。所以在我们编写程序的时候,就可以根据自己的需要很好的选择了。
20.现实的编码中,new是不常用的。我们通常都是采用短语句声明以及结构体的字面量达到我们的目的,比如:i:=0,u:=user{} 这样更简洁方便,而且不会涉及到指针这种比麻烦的操作。make函数是无可替代的,我们在使用slice、map以及channel的时候,还是要使用make进行初始化,然后才才可以对他们进行操作。使用make的好处是可以指定len和cap,make(type,len,cap),合适的len和cap可以提升性能。