Go編碼規範指南

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

序言

看過很多方面的編碼規範,可能每一家公司都有不同的規範,這份編碼規範是寫給我自己的,同時希望我們公司內部同事也能遵循這個規範來寫Go代碼。

如果你的代碼沒有辦法找到下面的規範,那麼就遵循標準庫的規範,多閱讀標準庫的源碼,標準庫的代碼可以說是我們寫代碼參考的標杆。

格式化規範

go預設已經有了gofmt工具,但是我們強烈建議使用goimport工具,這個在gofmt的基礎上增加了自動刪除和引入包.

go get golang.org/x/tools/cmd/goimports

不同的編輯器有不同的配置, sublime的配置教程:http://michaelwhatcott.com/gosublime-goimports/

LiteIDE預設已經支援了goimports,如果你的不支援請點擊屬性配置->golangfmt->勾選goimports

儲存之前自動fmt你的代碼。

行長約定

一行最長不超過80個字元,超過的請使用換行展示,盡量保持格式優雅。

go vet

vet工具可以幫我們靜態分析我們的源碼存在的各種問題,例如多餘的代碼,提前return的邏輯,struct的tag是否符合標準等。

go get golang.org/x/tools/cmd/vet

使用如下:

go vet .

package名字

保持package的名字和目錄保持一致,盡量採取有意義的包名,簡短,有意義,盡量和標準庫不要衝突。

import 規範

import在多行的情況下,goimports會自動幫你格式化,但是我們這裡還是規範一下import的一些規範,如果你在一個檔案裡面引入了一個package,還是建議採用如下格式:

import ( "fmt" )

如果你的包引入了三種類型的包,標準庫包,程式內部包,第三方包,建議採用如下方式進行組織你的包:

import ( "encoding/json" "strings" "myproject/models" "myproject/controller" "myproject/utils" "github.com/astaxie/beego" "github.com/go-sql-driver/mysql" )

有順序的引入包,不同的類型採用空格分離,第一種實標準庫,第二是項目包,第三是第三方包。

在項目中不要使用相對路徑引入包:

// 這是不好的匯入 import “../net” // 這是正確的做法 import “github.com/repo/proj/src/net”

變數申明

變數名採用駝峰標準,不要使用_來命名變數名,多個變數申明放在一起

var ( Found bool count int )

在函數外部申明必須使用var,不要採用:=,容易踩到變數的範圍的問題。

自訂類型的string迴圈問題

如果自訂的類型定義了String方法,那麼在列印的時候會產生隱藏的一些bug

type MyInt int func (m MyInt) String() string { return fmt.Sprint(m) //BUG:死迴圈 } func(m MyInt) String() string { return fmt.Sprint(int(m)) //這是安全的,因為我們內部進行了類型轉換 }

避免返回命名的參數

如果你的函數很短小,少於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 資訊

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(){ DoSomething(i) }() //錯誤的做法 go func(i int){ DoSomething(i) }(i)//正確的做法 }

http://golang.org/doc/articles/race_detector.html#Race_on_loop_counter

在邏輯處理中禁用panic

在main包中只有當實在不可啟動並執行情況採用panic,例如檔案無法開啟,資料庫無法串連導致程式無法
正常運行,但是對於其他的package對外的介面不能有panic,只能在包內採用。

強烈建議在main包中使用log.Fatal來記錄錯誤,這樣就可以由log來結束程式。

注釋規範

注釋可以幫我們很好的完成文檔的工作,寫得好的注釋可以方便我們以後的維護。詳細的如何寫注釋可以
參考:http://golang.org/doc/effective_go.html#commentary

bug注釋

針對代碼中出現的bug,可以採用如下教程使用特殊的注釋,在godocs可以做到注釋高亮:

// BUG(astaxie):This divides by zero.  var i float = 1/0

http://blog.golang.org/2011/03/godocdocumentinggocode.html

struct規範

struct申明和初始化格式採用多行:

定義如下:

type User struct{ Username string Email string }

初始化如下:

u := User{ Username: "astaxie", Email: "astaxie@gmail.com", }

recieved是實值型別還是指標類型

到底是採用實值型別還是指標類型主要參考如下原則:

func(w Win) Tally(playerPlayer)int //w不會有任何改變  func(w *Win) Tally(playerPlayer)int //w會改變資料

更多的請參考:https://code.google.com/p/go-wiki/wiki/CodeReviewComments#Receiver_Type

帶mutex的struct必須是指標receivers

如果你定義的struct中帶有mutex,那麼你的receivers必須是指標

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.