看過很多方面的編碼規範,可能每一家公司都有不同的規範,這份編碼規範是寫給我自己的,同時希望我們公司內部同事也能遵循這個規範來寫go**。
如果你的**沒有辦法找到下面的規範,那麼就遵循標準庫的規範,多閱讀標準庫的原始碼,標準庫的**可以說是我們寫**參考的標桿。
go預設已經有了gofmt工具,但是我們強烈建議使用goimport工具,這個在gofmt的基礎上增加了自動刪除和引入包.
go
getgolang
.org/x
/tools
/cmd
/goimports
不同的編輯器有不同的配置, sublime的配置教程:
liteide預設已經支援了goimports,如果你的不支援屬性配置->golangfmt->勾選goimports
儲存之前自動fmt你的**。
一行最長不超過80個字元,超過的請使用換行展示,盡量保持格式優雅。
vet工具可以幫我們靜態分析我們的原始碼存在的各種問題,例如多餘的**,提前return的邏輯,struct的tag是否符合標準等。
go
getgolang
.org/x
/tools
/cmd
/vet
使用如下:
go vet
.
保持package的名字和目錄保持一致,盡量採取有意義的包名,簡短,有意義,盡量和標準庫不要衝突。
import在多行的情況下,goimports會自動幫你格式化,但是我們這裡還是規範一下import的一些規範,如果你在乙個檔案裡面引入了乙個package,還是建議採用如下格式:
import
("fmt"
)
如果你的包引入了三種型別的包,標準庫包,程式內部包,第三方包,建議採用如下方式進行組織你的包:
)有順序的引入包,不同的型別採用空格分離,第一種實標準庫,第二是專案包,第三是第三方包。
在專案中不要使用相對路徑引入包:
// 這是不好的匯入
import
「../
net」
// 這是正確的做法
import
「github
.com
/repo
/proj
/src
/net
」
變數名採用駝峰標準,不要使用_
來命名變數名,多個變數申明放在一起
var
(found
bool
count
int)
在函式外部申明必須使用var,不要採用:=
,容易踩到變數的作用域的問題。
如果自定義的型別定義了string方法,那麼在列印的時候會產生隱藏的一些bug
type
myint
intfunc (m
myint
)string
()string
func(m
myint
)string
()string
如果你的函式很短小,少於10行**,那麼可以使用,不然請直接使用型別,因為如果使用命名變數很
容易引起隱藏的bug
func
foo(
a int,b
int)
(string,ok
)
當然如果是有多個相同型別的引數返回,那麼命名引數可能更清晰:
func (f
*foo
)location()(
float64
,float64
,error
)
下面的**就更清晰了:
// location returns f's latitude and longitude.
// negative values mean south and west, respectively.
func (f
*foo
)location()(
lat,
long
float64
,err error
)
錯誤處理的原則就是不能丟棄任何有返回err的呼叫,不要採用_
丟棄,必須全部處理。接收到錯誤,要麼返回err,要麼實在不行就panic,或者使用log記錄下來
error的資訊不要採用大寫字母,盡量保持你的錯誤簡短,但是要足夠表達你的錯誤的意思。
我們在呼叫fmt.sprint
或者log.sprint
之類的函式時,有時候會遇到很長的句子,我們需要在引數呼叫處進行多行分割:
下面是錯誤的方式:
log
.printf
(「a
long
format
string:%
s %d %
d %s」,
mystringparameter
,len(a
),expected
.size
,defrobnicate
(「anotherlongstringparameter
」,expected
.growth
.nanoseconds()/
1e6))
應該是如下的方式:
log
.printf(「
a long
format
string:%
s %d %
d %s」,
mystringparameter
,len(a
),expected
.size
,defrobnicate(「
anotherlongstringparameter
」,expected
.growth
.nanoseconds
()/1e6,),
)
在迴圈中呼叫函式或者goroutine方法,一定要採用顯示的變數呼叫,不要再閉包函式裡面呼叫迴圈的引數
fori:=0
;i<
limit;i
++()
//錯誤的做法
go func(i
int)(i)
//正確的做法
}
在main包中只有當實在不可執行的情況採用panic,例如檔案無法開啟,資料庫無法連線導致程式無法
正常執行,但是對於其他的package對外的介面不能有panic,只能在包內採用。
強烈建議在main包中使用log.fatal來記錄錯誤,這樣就可以由log來結束程式。
注釋可以幫我們很好的完成文件的工作,寫得好的注釋可以方便我們以後的維護。詳細的如何寫注釋可以
參考:針對**中出現的bug,可以採用如下教程使用特殊的注釋,在godocs可以做到注釋高亮:
// bug(astaxie):this divides by zero.
vari
float=1
/0
定義如下:
type
user
struct
初始化如下:
u
:=user
到底是採用值型別還是指標型別主要參考如下原則:
func(w
win)
tally
(playerplayer
)int
//w不會有任何改變
func(w
*win
)tally
(playerplayer
)int
//w會改變資料
更多的請參考:
如果你定義的struct中帶有mutex,那麼你的receivers必須是指標
go語言編碼規範
1.規範 1.規範 型別標識 例子int i i icount icount bool b b bshow bshow string s s sname sname uint u u ucolor ucolor float f f fplace fplace pointer p p pname pn...
Go 語言編碼風格指南
命名切片 字串隨機數 錯誤處理 在go語言官方提供的effective go的基礎之上,我們制定了如下的編碼規範作為補充。像這樣 this is a comment不要這樣 this is a comment用於 生成的指令不需要遵循這個規則 go generate go run gen.go另外,...
php 編碼規範哪些 php編碼規範
1.php 必須以完整的形式來定界 即不要使用php 短標籤 且保證在關閉標籤後不要有任何空格。2.當乙個字串是純文字組成的時候 即不含有變數 則必須總是以單引號 作為定界符。例如 a example string 3.變數替換中的變數只允許用 變數名 的形式。例如 greeting hello n...