Gofmt
大部分的格式问题可以通过gofmt解决,gofmt自动格式化代码,保证所有的go代码一致的格式。控制间距,锁进。
注释
注释可以通过godoc导出生成文档。
程序中每一个被导出的(大写的)名字,都应该有一个文档注释。
包注释
每个程序包都应该有一个包注释,一个位于package子句之前的块注释或行注释。
包如果有多个go文件,只需要出现在一个go文件中即可。
1 | //Package regexp implements a simple library |
可导出类型
第一条语句应该为一条概括语句,并且使用被声明的名字作为开头。public函数名大写。
1 | // Compile parses a regular expression and returns, if successful, a Regexp |
命名
包名
包名应该为小写单词,不要使用下划线或者混合大小写。接口名
单个函数的接口名以”er”作为后缀,如Reader,Writer
接口的实现则去掉“er”1
2
3type Reader interface {
Read(p []byte) (n int, err error)
}两个函数的接口名综合两个函数名
1
2
3
4type WriteFlusher interface {
Write([]byte) (int, error)
Flush() error
}三个以上函数的接口名,类似于结构体名
1
2
3
4
5type Car interface {
Start([]byte)
Stop() error
Recover()
}变量
1
2
3全局变量:驼峰式,结合是否可导出(是否public)确定首字母大小写
参数传递:驼峰式,小写字母开头
局部变量:下划线形式
控制结构
if 接受初始化语句
1
2
3if err := file.Chmod(0664); err != nil {
return err
}for 采用短声明建立局部变量
1
2
3
4sum := 0
for i := 0; i < 10; i++ {
sum += i
}range 遍历slice或map
1
2
3for k, v := range myslice{} // get key and value
for k := range myslice{} //only get key
for _, v:= range myslice{} //only get value
函数
- 函数采用命名的多值返回
- 传入变量和返回变量以小写字母开头
1
func nextInt(b []byte, pos int) (value, nextPos int) {}
import
- goimports实现了自动格式化
- 对import的包进行分组管理,而且标准库作为第一组
1
2
3
4
5
6
7
8
9
10
11
12
13package main
import (
"fmt"
"hash/adler32"
"os"
"appengine/user"
"appengine/foo"
"code.google.com/p/x/y"
"github.com/foo/bar"
)
缩写
- 采用全部大写或者全部小写来表示缩写单词
比如对于url, 要用urlPony
或者URLPony