GOROOT=/usr/local/lib/golang GOPATH=/root/go go version go1.10.3 linux/amd64
mkdir -p /root/go/src/k8s.io cd /root/go/src/k8s.io/ git clone https://github.com/kubernetes/kubernetes.git
目錄展現:
html
主要目錄:mysql
目錄名 | 功能 |
---|---|
cmd | 每一個組件代碼入口(main函數) |
pkg | 各個組件的具體功能實現 |
staging | 已經分庫的項目 |
vendor | 依賴 |
GO語言的關鍵特性主要包括如下幾方面:linux
package名字
保持package的名字和目錄保持一致,儘可能採起有意義的包名,簡短,有意義,儘可能和標準庫不要衝突。git
import 規範
import在多行的狀況下,自動工具會自動幫你格式化,可是咱們這裏仍是規範一下import的一些規範,若是你在一個文件裏面引入了一個package,仍是建議採用以下格式:github
import ( "fmt" )
若是你的包引入了三種類型的包,標準庫包,程序內部包,第三方包,建議採用以下方式進行組織你的包:golang
import ( "strings" "myproject/models" "myproject/controller" "github.com/mysql" )
有順序的引入包,不一樣的類型採用空格分離,第一種實標準庫,第二是項目包,第三是第三方包。在項目中不要使用相對路徑引入包:sql
// 這是很差的導入 import 「../pkg」 // 這是正確的作法 import 「github.com/tx23/pkg」
var ( Found bool count int )
type MyInt int func (m MyInt) String() string { return fmt.Sprint(m) //BUG:死循環 } func(m MyInt) String() string { return fmt.Sprint(int(m)) //這是安全的,由於咱們內部進行了類型轉換 }
func Foo(a int, b int) (string, ok){ }
固然若是是有多個相同類型的參數返回,那麼命名參數可能更清晰。數據庫
func (f *Foo) Location() (float64, float64, error)
編程
錯誤處理
錯誤處理的原則就是不能丟棄任何有返回err的調用,不要採用_丟棄,必須所有處理。接收到錯誤,要麼返回err,要麼實在不行就panic,或者使用log記錄下來,error的信息不要採用大寫字母,儘可能保持你的錯誤簡短,可是要足夠表達你的錯誤的意思。ubuntu
注意閉包的調用
在循環中調用函數或者goroutine方法,必定要採用顯示的變量調用,不要再閉包函數裏面調用循環的參數
fori:=0;i<limit;i++{ go func(){ DoSomething(i) }() //錯誤的作法 go func(i int){ DoSomething(i) }(i)//正確的作法 }
在邏輯處理中禁用panic
在main包中只有當實在不可運行的狀況採用panic,例如文件沒法打開,數據庫沒法鏈接致使程序沒法正常運行,可是對於其餘的package對外的接口不能有panic,只能在包內採用。強烈建議在main包中使用log.Fatal來記錄錯誤,這樣就能夠由log來結束程序。
struct規範
struct申明和初始化格式採用多行:
定義以下:
type User struct{ Username string Email string }
初始化以下:
u := User{ Username: "astaxie", Email: "astaxie@gmail.com", }
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
參考資料:
https://code.google.com/p/go-wiki/wiki/CodeReviewComments
http://golang.org/doc/effective_go.html