Go編碼規範指南

2021-06-27 15:30:15 字數 4399 閱讀 3121

看過很多方面的編碼規範,可能每一家公司都有不同的規範,這份編碼規範是寫給我自己的,同時希望我們公司內部同事也能遵循這個規範來寫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...