Parts of Effective Go
格式化
gofmt
或者go fmt
命令将Go
程序按照标准风格缩进、对齐,保留注释并在需要时重新格式化
注释
Go
支持C
风格的块注释/* */
和C++
风格的行注释//
godoc
既是一个程序,又是一个Web服务器,它对Go
的源码进行处理,并提取包中的文档内容
例:
1 | /* |
命名
包名
1 | // 当一个包被导入后,包名就会变成内容的访问器 |
包名应为其源码目录的基本名称
例:在src/pkg/encoding/base64
中的包应作为encoding/base64
导入,其包名应该是base64
,而不是encoding_base64
或者encodingBase64
长命名并不会使其更具可读性
例:once.Do, once.Do(setup)
表述足够清晰,使用once.DoOrWaitUntilDone(step)
并不好
获取器
Go
并不对获取器getter
和设置器setter
提供自动支持
例:若有一个名为owner
的字段(小写-未导出),其获取器应该命名为Owner
(大写-导出)而不是命名为GetOwner
,设置器可命名为SetOwner
1 | owner := obj.Owner() |
接口名
按照约定,只包含一个方法的接口应当以该方法名加上-er
后缀来命名
例:Reader
、Writer
、Formatter
、CloseNotifier
等
请将字符转换方法命名为String
而不是ToString
驼峰命名法
Go
约定使用驼峰命名法 MixedCaps
或者 mixedCaps
分号
和C
一样,Go
也是使用分号来结束语句,只不过这个分号不用出现在源代码里,词法分析器lexer
会依据规则自动在源码中插入分号。
插入规则
if the newline comes after a token that could end a statement, insert a semicolon
若在新行前的最后一个标记为标识符(int\float64...)
、数值
、字符串常量
、break
、continue
、fallthrough
、return
、++
、--
、)
、}
)之一,则始终在该标记后插入分号。
如果在一行中写多个语句,需要用分号隔开
无论如何,都不能将一个控制结构(if
、for
、switch
、select
)的左大括号放在下一行
1 | // 正确写法 |