一陋葡、注釋
推薦使用C語言風格的 “//” 注釋。注釋必須是完整的句子彻采,盡量簡明腐缤,以句點結(jié)尾。
程序中每一個可被導出的(大寫的)類型肛响,都應該有一個注釋岭粤。
在編碼階段同步寫好變量,函數(shù)特笋,包注釋剃浇,就可以使用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. 函數(shù)和結(jié)構(gòu)體
第一行寫概況蔫磨,并且使用被聲明的名字作為開頭淘讥。
// 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. 變量
- 全局變量:駝峰式榔至,可導出的使用大寫字母開頭
- 參數(shù)傳遞:駝峰式抵赢,小寫字母開頭
- 局部變量:下劃線風格命名
2.3. 接口
單函數(shù)的接口用 函數(shù)+“er” 命名,如:Reader唧取,Writer
type Reader interface {
Read(p []byte) (n int, err error)
}
2個函數(shù)的接口铅鲤,組合命名
type WriteFlusher interface {
Write([]byte) (int, error)
Flush() error
}
3個以上函數(shù)的接口名,類似于結(jié)構(gòu)體名
type Car interface {
Start([]byte)
Stop() error
Recover()
}
三兵怯、import
對標準包彩匕,程序內(nèi)部包,第三方包進行分組媒区。
import (
"encoding/json" //標準包
"strings"
"myproject/models" //內(nèi)部包
"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)
五介褥、函數(shù)
- 采用命名的多返回值,在godoc生成的文檔中递惋,帶有返回值的函數(shù)聲明更利于理解柔滔。
func nextInt(b []byte, pos int) (value, nextPos int, err error) {
六、錯誤處理
- 不要在邏輯代碼中使用panic
- error作為函數(shù)的值返回,必須對error進行處理
- 錯誤描述如果是英文必須為小寫萍虽,不需要標點結(jié)尾
- 采用獨立的錯誤流進行處理
不推薦:
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
參考: