golang 高质量代码编写 | 青训营笔记

72 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

golang 高质量代码编写

高质量代码第一步,多写注释

高质量代码第二步,命名要规范

  • 变量命名

    • 简短但不简洁
    • 缩略词要大写,例如 TTL 不能写成 Ttl
    • 若是使用范围广泛,尽量添加上下文信息,例如 userName不能简写成name,应该给出name的上下文
  • 方法命名

    • 尽量简短,见名知意
    • 返回结果为与包名一致的类型,则不需要后面加上类型信息,例如 time 包下的 Now() 方法 不用写成 NowTime() 。效果==> time.Now()
    • 如果返回的结果的类型与包名不一致,则需要加上类型信息,例如 strconv.ParseInt()
  • package命名

    • 只由小写字母构成
    • 不能与常用的库同名,因为别的地方也会调用
    • 简短但不简洁,包含上下文信息

高质量代码第三步,学会控制流程

把会发生 error 的场景前移,且尽量减少嵌套,避免回调地狱

例如校验用户的注册信息,在最后返回正常,前面有错误的情况都提前返回,下面是示例代码

func register(userAccount,userPassword string) error{
    if len(userAccount) < 6 {
        errors.New("账号长度不小于6位")
    }
    if len(userPassword) < 8 {
        errors.New("密码长度不小于8位")
    }
    //更多,视实际业务场景
    ...
    return nil
}

注意判断条件时尽量把耗时短的条件前置。比如需要从数据库中查询是否有当前账号,数据库的查询需要的耗时比较长,应该后置这种判断,在耗时短的判断不成立时返回 error ,而不是先执行耗时长的判断。

高质量代码第四步,性能优化

  • 在初始化 slice 和 map 时应该预分配大小,避免在后续过程中一直申请内存,额外增加时间浪费。但也不应追求不申请扩容带来内存的浪费。
  • 字符串拼接可以使用 strings.Builder 来提升运行效率,是因为 golang 中 string 是引用类型,是不可变的,在进行字符串拼接时会开辟新的内存空间,而strings.Builder 的底层用的是 byte数组 ,有自己的内存扩容策略,不需要每次拼接重新分配内存。
  • 可以使用空结构体 struct{} 进行占位,例如map中只需要 key 而不需要value ,这时候就能给value赋值 struct{} 减少内存的浪费