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 | // 正确写法 |