自己易忽略的golang规范

本文探讨了Go语言编程中的一些关键规范和最佳实践,包括Interface合理性验证、Mutex使用、Channel大小选择、枚举从1开始的约定、错误处理策略、Atomic操作的安全性、Slice的检查与使用、range循环的注意事项、HTTP响应体的关闭、原地过滤切片、defer使用避免内存泄露、ticker的停止、sync.Pool的使用以及二进制优化等。同时提供了编译期检查接口实现、获取调用堆栈和生成随机元素的方法。
摘要由CSDN通过智能技术生成
  • Interface 合理性验证

var _ http.Handler = (*Handler)(nil)
  • 关于Mutex

type smap struct {
   
  sync.Mutex // only for unexported types(仅适用于非导出类型)

  data map[string]string
}

type SMap struct {
   
  mu sync.Mutex // 对于导出类型,请使用私有锁

  data map[string]string
}
  • Channel 的 size 要么是 1,要么是无缓冲的

    // 大小:1
    c := make(chan int, 1) // 或者
    // 无缓冲 channel,大小为 0
    c := make(chan int)
    
  • 枚举从 1 开始

    type Operation int
    
    const (
      Add Operation = iota + 1
      Subtract
      Multiply
    )
    
    // Add=1, Subtract=2, Multiply=3
    

    在某些情况下,使用零值是有意义的(枚举从零开始),例如,当零值是理想的默认行为时。

  • Errors返回形式

    • 这是一个不需要额外信息的简单错误吗?如果是这样,errors.New 足够了。

    • 客户需要检测并处理此错误吗?如果是这样,则应使用自定义类型并实现该 Error() 方法。

    • 您是否正在传播下游函数返回的错误?如果是这样,请查看本文后面有关错误包装 section on error wrapping 部分的内容。

    • 否则 fmt.Errorf 就可以了。

      如果客户端需要检测错误,并且您已使用创建了一个简单的错误 errors.New,请使用一个错误变量。

      // package foo
      
      var ErrCouldNotOpen = errors.New("could not open")
      
      func Open() error {
             
        return ErrCouldNotOpen
      }
      
      // package bar
      
      if err := foo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值