go语言规范指南

  1. 写完代码都必须格式化,保证代码优雅: gofmt goimports
  2. 编译前先执行代码静态分析: go vet pathxxx/ 可以检测出如下的常见错误:
//Print-format 打印格式错误
var str string
fmt.Printf("str:%d", str)
//Boolean 可疑布尔值
var i int
fmt.Println(i==0 && i==1)
//Range 闭包变量问题
words := []string{"f","b"}
for _, w := words {
    go func() {
        fmt.Println(w)
    }()
}
//位移问题
fmt.Println(i>>32)
//提前结束,后续代码不可达
return
  1. 竞态检测: go build –race (测试环境编译时加上 -race 选项,生产环境必须去掉,因为race限制最多goroutine数量为8192个)
  2. package 名字:包名与目录保持一致,尽量有意义,简短,不和标准库冲突, 全小写,不要有下划线
  3. 每行长度约定: 一行不要太长,超过请使用换行展示,尽量保持格式优雅;单个文件也不要太大,最好不要超过500行
  4. 错误处理机制:使用多返回值 error, 不要使用 c 风格,返回错误码,错误 信息放在输入参数,特别是封装 cgo 的函数
    7,多返回值最多返回三个,超过三个请使用 struct
  5. 请求路径携带标准库 context 上下文:一个请求内的所有处理逻辑都必须带上 context,并且以函数第一个参数传入,context 可以取消,超时,传值
  6. 注意 slice 引用问题:使用 copy 防止数据篡改,防止无法 GC 而导致内存泄漏
  7. new 新对象采用多行,更加一目了然
p := &StructName{

    field1: 1,

    field2: "aaaa",
}
  1. 变量名采用驼峰法,不要有下划线,不要全部大写
  2. 时刻提醒自己 goroutine 的生命周期,注意同步 channel,防止 goroutine 堵 住,释放不了,出现内存泄漏
  3. 注意关闭 channel 问题,不能 close 两次,不能向 closed 的 chan 写入数据
  4. 不可在 goroutine 内部做耗时的纯逻辑计算工作,如死循环,cgo 同步函数,cgo系统调用
  5. 自定义类型的 String 方法死循环问题,不可在 String 方法内使用 fmt 打印自 己
type MyInt int

func (m MyInt) String() string {

     return fmt.Sprint(m) //BUG:死循环
}

func (m MyInt) String() string {

    return fmt.Sprint(int(m)) //这是安全的,因为我们内部进行了类型转换
}
  1. 注释规范:每个包,可导出 struct,函数,常量,变量,都必须要有注释, 格式是紧挨着的上一行,这样写:
// Package pkgname xxxx
// FuncName xxxx
// TODO xxxx
// BUG xxxx

每一个对外服务的接口都要注释接口功能、调用方,每个后端调用都要注释后台功能、负责人,这样方便联调对接以及后续交接维护

  1. 在逻辑处理中禁用 panic,除非你知道你在做什么
  2. 不要忽略 error,每个 error 都必须处理,实在不用处理,就打印 error。有 错误尽早返回
    不要这样写:
if err != nil {

    // error handling

} else {

    // normal code

}

而应该是:

if err != nil {

    // error handling

    return // or continue, etc.
}

// normal code
  1. 常用的首字母缩写名词,使用全小写或者全大写,如 UIN URL HTTP ID IP OK
  2. Receiver::用一两个字符,能够表示出类型,不要使用 me self this
  3. 参数传递:
    – 对于少量数据,不要传递指针
    – 对于大量数据的 struct 可以考虑使用指针
    – 传入参数是 map,slice,chan,interface,string 不要传递指针
  4. 每个基础库都必须有实际可运行的例子, 基础库的接口都要有单元测试用例
  5. 尽量少用命名多返回值,如果要用,必须显示 return结果,因为作用域问题容易出bug,例如:
func test1() (a int, e error) {
    return 1, errors.New("test1")
}

func test2() (a int, e error) {
    a, e = 10, nil
    for {
        aa, e := test1()    //  注意:这里的 e 是新的变量
        if aa == 1 || e != nil {
           break
        }
    }
    return    // 这里返回的e不是预期错误,而是nil
}
  1. ctx是当前请求上下文,在请求退出时会cancel掉,在自己另起的goroutine里面不要使用同一个ctx请求后端
  2. http服务在超时以及客户端主动断开连接的时候会有另外的goroutine写context,业务代码里面不能直接打印整个ctx,如 fmt.Printf("%+v", ctx), 否则会导致服务crash
  3. 不要在for循环里面使用defer,defer只有在函数退出时才会执行
  4. udp请求使用net.DialUDP时,内部会调用connect,只能接收来自对端的回包,这对于非原路径回包的场景下会有问题
  5. 禁止在业务代码里面调用cgo
  6. panic捕获只能到goroutine最顶层,每个自己启动的goroutine,必须在入口处就捕获panic,并打印出详细的堆栈信息
  7. golang的内置类型slice,map,chan都是引用,初次使用前,都必须先用make分配好对象,不然会有空指针异常
  8. 使用map时需要注意:map初次使用,必须用make初始化;map是引用,不用担心赋值内存拷贝;并发操作时,需要加锁;range遍历时顺序不确定,不可依赖;不能使用slice,map和func作为key
  9. mysql scan过程中,不允许执行其他sql语句,否则会导致数据集错乱
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容