GO-TIPS

  • 当把时间作为一个变量传递时,可能会导致的问题,比如:
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语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的。本文介绍了Go语言中如何定...
    雪上霜阅读 263评论 0 0
  • 目录 1.go 各种代码运行 2.go 在线编辑代码运行 3.通过 Gob 包序列化二进制数据 4.使用 ...
    杨言锡阅读 1,163评论 0 1
  • Awesome GitHub Topic for Go Awesome Go golang-open-source...
    Liam_ml阅读 3,901评论 2 14
  • 输入与输出-fmt包 时间与日期-time包 命令行参数解析-flag包 日志-log包 IO操作-os包 IO操...
    思考的山羊阅读 6,519评论 0 5
  • 浅析 go context 用法demo WithCancelfunc WithCancel(parent Con...
    超鸽带你飞阅读 857评论 0 1