Golang 編碼規范

一、注釋

推薦使用C語言風格的 “//” 注釋。注釋必須是完整的句子,盡量簡明,以句點結尾。
程序中每一個可被導出的(大寫的)類型,都應該有一個注釋。
在編碼階段同步寫好變量,函數,包注釋,就可以使用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. 函數和結構體

第一行寫概況,并且使用被聲明的名字作為開頭。

// 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. 變量

  • 全局變量:駝峰式,可導出的使用大寫字母開頭
  • 參數傳遞:駝峰式,小寫字母開頭
  • 局部變量:下劃線風格命名

2.3. 接口

單函數的接口用 函數+“er” 命名,如:Reader,Writer

type Reader interface {
        Read(p []byte) (n int, err error)
}

2個函數的接口,組合命名

type WriteFlusher interface {
    Write([]byte) (int, error)
    Flush() error
}

3個以上函數的接口名,類似于結構體名

type Car interface {
    Start([]byte)
    Stop() error
    Recover()
}

三、import

對標準包,程序內部包,第三方包進行分組。

import (
    "encoding/json"         //標準包
    "strings"

    "myproject/models"      //內部包
    "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)

五、函數

  • 采用命名的多返回值,在godoc生成的文檔中,帶有返回值的函數聲明更利于理解。
func nextInt(b []byte, pos int) (value, nextPos int, err error) {

六、錯誤處理

  • 不要在邏輯代碼中使用panic
  • error作為函數的值返回,必須對error進行處理
  • 錯誤描述如果是英文必須為小寫,不需要標點結尾
  • 采用獨立的錯誤流進行處理

不推薦:

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

參考:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • gofmt 大部分的格式問題可以通過gofmt解決,gofmt自動格式化代碼,保證所有的go代碼與官方推薦的格式保...
    莫云溪閱讀 9,702評論 2 16
  • gofmt 大部分的格式問題可以通過gofmt解決,gofmt自動格式化代碼,保證所有的go代碼一致的格式。 正常...
    土豆_大大閱讀 977評論 0 51
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • Android編碼規范 源文件基礎 文件名 源文件以其最頂層的類名來命名,大小寫敏感,文件擴展名為.java。 文...
    呼呼哥閱讀 991評論 0 0
  • 把風揉進林中 隱約間樹影重重 讓夜色鉆入海里 惹得一陣漣漪 火車去擁抱鐵軌 汽笛從靜穆中悠回 我自小巷子離開 卻總...
    言又止1閱讀 241評論 0 0