一、go语言开发技巧

1.package 的名字和目录名一样,main 除外
2.string 表示的是不可变的字符串变量,对 string 的修改是比较重的操作,基本上都需要重新申请内存,如果没有特殊需要,3需要修改时多使用 []byte
3.尽量使用 strings 库操作 string,这样做可以提高性能
4.append 要小心自动分配内存,append 返回的可能是新分配的地址
5.如果要直接修改 map 的 value 值,则 value 只能是指针,否则要覆盖原来的值
6.map 在并发中需要加锁
7.编译过程无法检查 interface{} 的转换,只有运行时检查,小心引起 panic
8.使用 defer,保证退出函数时释放资源
9.尽量少用全局变量,通过参数传递,使每个函数都是“无状态”的,这样减少耦合,也方便分工和单元测试
10.参数如果比较多,将相关参数定义成结构体传递

二、go语言规范

1.写完代码都必须格式化,保证代码优雅:gofmt goimports
2.编译前先执行代码静态分析:go vet pathxxx/
3.package 名字:包名与目录保持一致,尽量有意义,简短,不和标准库冲突, 全小写,不要有下划线
4.竞态检测:go build –race (测试环境编译时加上 -race 选项,生产环境必须去掉,因为 race 限制最多 goroutine 数量为 8192 个)
5.每行长度约定:一行不要太长,超过请使用换行展示,尽量保持格式优雅;单个文件也不要太大,最好不要超过 500 行
6.多返回值最多返回三个,超过三个请使用 struct
7.变量名采用驼峰法,不要有下划线,不要全部大写
8.在逻辑处理中禁用 panic,除非你知道你在做什么
9.错误处理的原则就是不能丢弃任何有返回 err 的调用,不要采用_丢弃,必须全部处理。
10.常用的首字母缩写名词,使用全小写或者全大写,如 UIN URL HTTP ID IP OK
11.Receiver::用一两个字符,能够表示出类型,不要使用 me self this
12.参数传递:对于少量数据,不要传递指针;对于大量数据的 struct 可以考虑使用指针;传入参数是 map,slice,chan,interface,string 不要传递指针。
13.每个基础库都必须有实际可运行的例子, 基础库的接口都要有单元测试用例
14.不要在 for 循环里面使用 defer,defer只有在函数退出时才会执行
15.panic 捕获只能到goroutine最顶层,每个自己启动的 goroutine,必须在入口处就捕获panic,并打印出详细的堆栈信息
16.Go 的内置类型slice、map、chan都是引用,初次使用前,都必须先用 make 分配好对象,不然会有空指针异常
17.使用 map 时需要注意:map 初次使用,必须用 make 初始化;map 是引用,不用担心赋值内存拷贝;并发操作时,需要加锁;range 遍历时顺序不确定,不可依赖;不能使用 slice、map 和 func 作为 key
18.import 在多行的情况下,goimports 会自动帮你格式化,但是我们这里还是规范一下 import 的一些规范。
19.如果你的函数很短小,少于 10 行代码,那么可以使用,不然请直接使用类型,因为如果使用命名变量很容易引起隐藏的 bug。 
20.长句子打印或者调用,使用参数进行格式化分行 我们在调用 fmt.Sprint 或者 log.Sprint 之类的函数时,有时候会遇到很长的句子,我们需要在参数调用处进行多行分割。
21.注意闭包的调用 在循环中调用函数或者 goroutine 方法,一定要采用显示的变量调用,不要在闭包函数里调用循环的参数
22.常量命名 常量均需使用全部大写字母组成,并使用下划线分词