go-tips

By on
  • 当把时间作为一个变量传递时,可能会导致的问题,比如:
waitTime := 30
wait := waitTime * time.Second

这样子是错误的,因为 waitTime 不是 time.Duration 类型,但如果直接写 30 * time.Second 就会成功    

在不太了解的情况下,我手动把 waitTime 通过“诡异”的方式变成了 time.Duration 类型

waitTime := 30 * time.Second
wait := waitTime * time.Second

这种情况下 wait 的值就变成了 88 万小时,不是预想的结果,正确的写法如下:

waitTime := 30
wait := time.Duration(waitTime) * time.Second
  • 当 waitGroup 使用时要清楚的知道 Done 方法的执行次数,如果是类似递归的结构,执行了多次 Done 方法,则会导致waitGroup 的计数器溢出,导致边界错误,如下:

carbon.png

这段代码运行时会导致 panic: sync: negative WaitGroup counter,所以我们在实际编写代码的过程中,如果有类似的情况,可以通过将有限次数的递归转换为迭代的形式来规避这种问题。总之,你需要明确的知道 Done 方法执行了几次。

  • 在 goroutine 使用的过程中我们是无法拿到当前 goroutine 的报错信息的,从而可能需要额外建立一个通道,将报错信息传递到某一个 channel 中,然后监听 channel 来进行错误处理。官方提供了一项实验功能,可以用来解决这个问题。官方包在这里:golang.org/x/sync/errgroup

  • 在开发过程中可以使用 go vet 工具来检测可能会出现的代码漏洞,帮助查漏补缺。使用方式

  • 在开发时要使用 internal 下的 log 包打日志才能被 ELK 捕获到,logrus 则不行,但如果命令行中的即使反馈日志,或者即时性比较强没有留存意义的日志,理当不计入 ELK 的统计当中,这时候需要用 logrus

  • 字符串拼接使用哪种方式更快呢?

已知的四种方式分别是:1. 使用 fmt.Sprintf 函数 2. 使用加号拼接 3. 使用 strings 包 4. 使用 bytes

  • 使用 golangci-lint 静态代码检查工具,可以配置各种各样的 linter,uber 的 go 规范中建议将 errcheck、goimports、golint、govet、staticcheck 设置为默认的 linter,如果要配置更多的 linter 可以参考这里