【Go 夜读】第 63 期 Go 编码风格阅读与讨论

yangwen13 · 2020-02-16 07:53:32 · 629 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-02-16 07:53:32 的主题,其中的信息可能已经有所发展或是发生改变。

文章来自于:https://reading.developerlearning.cn/reading/63-2019-10-17-go-style-and-go-advices/

观看视频

https://youtu.be/91YbbwlKZ2k

Go 夜读第 63 期 Go 编码风格阅读与讨论

内容简介

本期主要是针对近期 uber-go/guide style 和 go-advices 的解读以及开发者讨论。

内容大纲

  • Go CodeReview Comments
  • Uber-go/style
  • Go-advices

分享地址

2019-10-17 21:00:00 ~ 22:10:00, UTC+8

https://zoom.us/j/6923842137

分享 Slides

https://docs.google.com/presentation/d/1MlzZJBK0Zq0VzJVC_AqSWmmlS4Of-8xY6NGZmfhKQXI/edit?usp=sharing

进一步阅读的材料

Go CodeReviewComments 翻译

Go 官方的建议已经涉及到非常方面:

  • Gofmt
  • Comment Sentences
  • Contexts
  • Copying
  • Crypto Rand
  • Declaring Empty Slices
  • Doc Comments
  • Don't Panic
  • Error Strings
  • Examples
  • Goroutine Lifetimes
  • Handle Errors
  • Imports
  • Import Dot
  • In-Band Errors
  • Indent Error Flow
  • Initialisms
  • Interfaces
  • Line Length
  • Mixed Caps
  • Named Result Parameters
  • Naked Returns
  • Package Comments
  • Package Names
  • Pass Values
  • Receiver Names
  • Receiver Type
  • Synchronous Functions
  • Useful Test Failures
  • Variable Names

gofmt

不管你是用什么开发工具,都推荐一定要配置 goimports。

Context

  • Context 应该在函数的第一个参数;
  • 不要将 Context 加到结构体中,而应该加一个 ctx 参数;
  • 不要创建自定义的 Context 类型;
  • Context 是不可变的,所以可以将相同的 ctx 传递给调用共享相同截止日期,取消信号,凭证,父跟踪等;

虽然官方已经说明了,但是也还是有不少公司或者开源项目有自己的设计和实现。

Declaring Empty Slices

var t[]stringt:= []string{} 更好

Imports

应该按系统库、内部库、第三方库分层分隔。

Indent Error Flow

if err != nil {
    // error handling...
    return // or continue, etc.
}
// other code
x, err := f()
if err != nil {
    // error handling...
    return
}
// use x...

Variable Names

  • 局部变量应该越精简越好;
  • 不通用的或者全局变量,应该描述更清楚的命名;

Uber Go 风格指南翻译

上周刚出来,过了2天,就出现大量的翻译文章,也能够看出来 Go 语言虽然官方有 gofmt,以及 go vet 静态代码检测工具,但是也抵挡不住大家对于代码风格的热衷。

也说明大家还希望将代码风格更统一,追求更好的代码。

Go-advices

  • Code
  • Concurrency
  • Performance
  • Modules
  • Build
  • Testing
  • Tools
  • Misc

代码方面

  • var foo time.Durationvar fooMillis int64 更好
  • 检查 defer 中的 error
  • %+v 打印足够详细信息
  • 小心 range
  • map 中读取一个不存在的 key 不会 panic,建议:value, ok := map[“no_key”]
  • 将 defer 移到顶部

Dave Cheney


Q&A 总结

  1. 下划线开头 来声明 全局变量

    很少见,也不太适用。

  2. 为什么建议channel尽量不加buffer?

    按需分配。

  3. go.uber.org/atomic

    库非常好,原子操作很方便。新增多种数据类型。

  4. package_test 比 package 好?

    比较清晰,但是也有局限性,测试不了内部逻辑,类似于外部包调用。

  5. go test 指定 -count 可以消除偶然因素导致的不稳定结果。

    -count=1 也可以消除 cache。

  6. 有没有认证或授权库的推荐?

    github 上搜索即可,一般可以根据 star 数量和活跃情况来评判。 也可以去 godoc.org 搜索,查看 imports 引入数据来评判。 https://github.com/dgrijalva/jwt-go



有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

629 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传