一、注釋
推薦使用C語言風格的 “//” 注釋。注釋必須是完整的句子,盡量簡明,以句點結尾。
程序中每一個可被導出的(大寫的)類型,都應該有一個注釋。
在編碼階段同步寫好變量,函數,包注釋,就可以使用godoc生成文檔
1.1. 包
每個包都應該有一個包注釋,包如果有多個go文件,就只需要在入口文件寫包注釋。
概況以 Package 開頭。
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is Governed by a BSD-style
// license that can be found in the LICENSE file.
// Package strings implements simple functions to manipulate strings.
package strings
1.2. 函數和結構體
第一行寫概況,并且使用被聲明的名字作為開頭。
// Compile parses a regular expression and returns, if successful, a Regexp
// object that can be used to match against text.
func Compile(str string) (regexp *Regexp, err error) {
// Request represents a request to run a command.
type Request struct { ...
二、命名
- 使用短命名,因為長名字并不會使得事物更易讀,文檔注釋會比格外長的名字更有用。
- 需要導出的任何類型必須以大寫字母開頭。
2.1. 包名
包名應該為小寫單詞,不要使用下劃線或者混合大小寫。
2.2. 變量
- 全局變量:駝峰式,可導出的使用大寫字母開頭
- 參數傳遞:駝峰式,小寫字母開頭
- 局部變量:下劃線風格命名
2.3. 接口
單函數的接口用 函數+“er” 命名,如:Reader,Writer
type Reader interface {
Read(p []byte) (n int, err error)
}
2個函數的接口,組合命名
type WriteFlusher interface {
Write([]byte) (int, error)
Flush() error
}
3個以上函數的接口名,類似于結構體名
type Car interface {
Start([]byte)
Stop() error
Recover()
}
三、import
對標準包,程序內部包,第三方包進行分組。
import (
"encoding/json" //標準包
"strings"
"myproject/models" //內部包
"myproject/utils"
"github.com/go-sql-driver/mysql" //第三方包
)
引用包時不要使用相對路徑。
// 這是不好的導入
import “../net”
// 這是正確的做法
import “github.com/repo/proj/src/net”
四、流程控制
4.1. if
if接受初始化語句,約定如下方式建立局部變量。
if err := file.Chmod(0664); err != nil {
return err
}
4.2. for
采用短聲明建立局部變量。
for i := 0; i < 10; i++ {
}
4.3. range
如果只需要第一個 key,就省略第二個
for key := range array {
}
如果只需要第二個 value,則丟棄第一個
for _, value := range array {
}
4.4. return
盡早return
f, err := os.Open(name)
if err != nil {
return err
}
f.Close()
d, err := f.Stat()
if err != nil {
return err
}
codeUsing(f, d)
五、函數
- 采用命名的多返回值,在godoc生成的文檔中,帶有返回值的函數聲明更利于理解。
func nextInt(b []byte, pos int) (value, nextPos int, err error) {
六、錯誤處理
- 不要在邏輯代碼中使用panic
- error作為函數的值返回,必須對error進行處理
- 錯誤描述如果是英文必須為小寫,不需要標點結尾
- 采用獨立的錯誤流進行處理
不推薦:
if err != nil {
// error handling
} else {
// normal code
}
好的方式:
if err != nil {
// error handling
return // or continue, etc.
}
// normal code
如果返回值需要初始化,則采用下面的方式
x, err := f()
if err != nil {
// error handling
return
}
// use x
參考: