GO-TIPS

作者: 木叶简 | 来源:发表于2021-08-18 11:40 被阅读0次
    • 当把时间作为一个变量传递时,可能会导致的问题,比如:
    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 工具来检测可能会出现的代码漏洞,帮助查漏补缺。使用方式
    • 问:字符串拼接使用哪种方式更快呢?答:已知的四种方式分别是,1. 使用 fmt.Sprintf 函数 2. 使用加号拼接 3. 使用 strings 包 4. 使用 bytes
    • 使用 golangci-lint 静态代码检查工具,可以配置各种各样的 linter,uber 的 go 规范中建议将 errcheck、goimports、golint、govet、staticcheck 设置为默认的 linter,如果要配置更多的 linter 可以参考这里

    相关文章

      网友评论

          本文标题:GO-TIPS

          本文链接:https://www.haomeiwen.com/subject/pilgbltx.html