没有合适的资源?快使用搜索试试~ 我知道了~
首页Uber Go 语言编程规范 中文版.pdf
Uber Go 语言编程规范 中文版 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter. 其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 GitHub,经过一年的积累和更新,该规范已经初具规模,并受到广大 Gopher 的关注。本文是该规范的中文版本。
资源详情
资源评论
资源推荐
uber-go/guide 的中⽂翻译
English
Uber Go 语⾔编码规范
Uber 是⼀家美国硅⾕的科技公司,也是 Go 语⾔的早期 adopter. 其开源了很多 golang 项
⽬,诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go ⻛格规范 开源
到 GitHub,经过⼀年的积累和更新,该规范已经初具规模,并受到⼴⼤ Gopher 的关注。本⽂
是该规范的中⽂版本。本版本会根据原版实时更新。
1. 版本
当前更新版本:2019-10-23 版本地址:commit:#55~#61
如果您发现任何更新、问题或改进,请随时 fork 和 PR
Please feel free to fork and PR if you find any updates, issues or improvement.
2. ⽬录
介绍
指导原则
指向 interface 的指针
接收器 (receiver) 与接⼝
零值 Mutex 是有效的
在边界处拷⻉ Slices 和 Maps
使⽤ defer 释放资源
Channel 的 size 要么是 1,要么是⽆缓冲的
枚举从 1 开始
错误类型
错误包装 (Error Wrapping)
处理类型断⾔失败
不要 panic
使⽤ go.uber.org/atomic
性能
优先使⽤ strconv ⽽不是 fmt
避免字符串到字节的转换
尽量初始化时指定 Map 容量
规范
⼀致性
相似的声明放在⼀组
import 分组
包名
函数名
导⼊别名
函数分组与顺序
减少嵌套
不必要的 else
顶层变量声明
对于未导出的顶层常量和变量,使⽤_作为前缀
结构体中的嵌⼊
使⽤字段名初始化结构体
本地变量声明
nil 是⼀个有效的 slice
⼩变量作⽤域
避免参数语义不明确(Avoid Naked Parameters)
使⽤原始字符串字⾯值,避免转义
初始化 Struct 引⽤
Initializing Maps
字符串 string format
命名 Printf 样式的函数
编程模式
表驱动测试
功能选项
3. 介绍
样式 (style) 是⽀配我们代码的惯例。术语 样式 有点⽤词不当,因为这些约定涵盖的范围不
限于由 gofmt 替我们处理的源⽂件格式。
本指南的⽬的是通过详细描述在 Uber 编写 Go 代码的注意事项来管理这种复杂性。这些规
则的存在是为了使代码库易于管理,同时仍然允许⼯程师更有效地使⽤ Go 语⾔功能。
该指南最初由 [Prashant Varanasi] 和 [Simon Newton] 编写,⽬的是使⼀些同事能快速使
⽤ Go。多年来,该指南已根据其他⼈的反馈进⾏了修改。
本⽂档记录了我们在 Uber 遵循的 Go 代码中的惯⽤约定。其中许多是 Go 的通⽤准则,⽽
其他扩展准则依赖于下⾯外部的指南:
1. Effective Go
2. The Go common mistakes guide
所有代码都应该通过 golint 和 go vet 的检查并⽆错误。我们建议您将编辑器设置为:
保存时运⾏ goimports
运⾏ golint 和 go vet 检查错误
您可以在以下 Go 编辑器⼯具⽀持⻚⾯中找到更为详细的信息: https://github.com/golan
g/go/wiki/IDEsAndTextEditorPlugins
4. 指导原则
4.1. 指向 interface 的指针
您⼏乎不需要指向接⼝类型的指针。您应该将接⼝作为值进⾏传递,在这样的传递过程中,
实质上传递的底层数据仍然可以是指针。
接⼝实质上在底层⽤两个字段表示:
1. ⼀个指向某些特定类型信息的指针。您可以将其视为"type."
2. 数据指针。如果存储的数据是指针,则直接存储。如果存储的数据是⼀个值,则存储指向该值的指
针。
如果希望接⼝⽅法修改基础数据,则必须使⽤指针传递。
4.2. 接收器 (receiver) 与接⼝
使⽤值接收器的⽅法既可以通过值调⽤,也可以通过指针调⽤。
例如,
同样,即使该⽅法具有值接收器,也可以通过指针来满⾜接⼝。
type S struct {
data string
}
func (s S) Read() string {
return s.data
}
func (s *S) Write(str string) {
s.data = str
}
sVals := map[int]S{1: {"A"}}
// 你只能通过值调⽤ Read
sVals[1].Read()
// 这不能编译通过:
// sVals[1].Write("test")
sPtrs := map[int]*S{1: {"A"}}
// 通过指针既可以调⽤ Read,也可以调⽤ Write ⽅法
sPtrs[1].Read()
sPtrs[1].Write("test")
Bad Good
Effective Go 中有⼀段关于 pointers vs. values 的精彩讲解。
4.3. 零值 Mutex 是有效的
sync.Mutex 和 sync.RWMutex 是有效的。因此你⼏乎不需要⼀个指向 mutex 的指针。
如果你使⽤结构体指针,mutex 可以⾮指针形式作为结构体的组成字段,或者更好的⽅式
是直接嵌⼊到结构体中。 如果是私有结构体类型或是要实现 Mutex 接⼝的类型,我们可以使⽤
嵌⼊ mutex 的⽅法:
type F interface {
f()
}
type S1 struct{}
func (s S1) f() {}
type S2 struct{}
func (s *S2) f() {}
s1Val := S1{}
s1Ptr := &S1{}
s2Val := S2{}
s2Ptr := &S2{}
var i F
i = s1Val
i = s1Ptr
i = s2Ptr
// 下⾯代码⽆法通过编译。因为 s2Val 是⼀个值,⽽ S2 的 f ⽅法中没有使⽤值接收器
// i = s2Val
mu := new(sync.Mutex)
mu.Lock()
var mu sync.Mutex
mu.Lock()
type smap struct {
sync.Mutex // only for unexported types(仅适⽤于⾮导出类型)
为私有类型或需要实现互斥接⼝的类型嵌⼊。 对于导出的类型,请使⽤专⽤字段。
4.4. 在边界处拷⻉ Slices 和 Maps
slices 和 maps 包含了指向底层数据的指针,因此在需要复制它们时要特别注意。
4.4.1. 接收 Slices 和 Maps
请记住,当 map 或 slice 作为函数参数传⼊时,如果您存储了对它们的引⽤,则⽤户可以
对其进⾏修改。
data map[string]string
}
func newSMap() *smap {
return &smap{
data: make(map[string]string),
}
}
func (m *smap) Get(k string) string {
m.Lock()
defer m.Unlock()
return m.data[k]
}
type SMap struct {
mu sync.Mutex // 对于导出类型,请使⽤私有锁
data map[string]string
}
func NewSMap() *SMap {
return &SMap{
data: make(map[string]string),
}
}
func (m *SMap) Get(k string) string {
m.mu.Lock()
defer m.mu.Unlock()
return m.data[k]
}
剩余35页未读,继续阅读
sea_way
- 粉丝: 8
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 27页智慧街道信息化建设综合解决方案.pptx
- 计算机二级Ms-Office选择题汇总.doc
- 单链表的插入和删除实验报告 (2).docx
- 单链表的插入和删除实验报告.pdf
- 物联网智能终端项目设备管理方案.pdf
- 如何打造品牌的模式.doc
- 样式控制与页面布局.pdf
- 武汉理工Java实验报告(二).docx
- 2021线上新品消费趋势报告.pdf
- 第3章 Matlab中的矩阵及其运算.docx
- 基于Web的人力资源管理系统的必要性和可行性.doc
- 基于一阶倒立摆的matlab仿真实验.doc
- 速运公司物流管理模式研究教材
- 大数据与管理.pptx
- 单片机课程设计之步进电机.doc
- 大数据与数据挖掘.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1