iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
1

摘要

一個優良的編碼規範可以讓團隊在開發時擁有一個統一的代碼風格,提升代碼的可讀性,規範性和統一性。

語言規範

語法檢查 gofmt

所有代碼都用Gofmt做格式化和優化。

推薦goimport工作,這個工具在gofmt的基礎上新增了自動添加和刪入package的功能。

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

不同的IDE有不同配置:
sublime: http://michaelwhatcott.com/gosublime-goimports/
LiteIDE: 默認支持goimport,可以自行到 configure -> golangfmt -> goimports確認是否勾選。
Goland: Goland -> Preferences -> File Watchers -> 添加goimports。
其他未提到的可以自行到官方網站搜尋相關配置文件。

General

  1. package命名應該儘可能簡短並且所有的字母都是小寫。
  2. receiver命名最多2個字母,不要使用me、self或者this,例如
    func (c *Client) GetUserName() string
  3. 每行代碼長度最好不超過80個字符。
  4. 函數傳遞參數時採用傳“指針“類型,參數類型本身是引用類型的map、slice、chan除外。
    函數返回值採用“指針“類型而不是返回“值“。
  5. 錯誤處理的原則是不忽略任何error,不要使用"_"丟棄。接收到錯誤後可以返回給上層調用,或者使用log打印對應的error和warn信息。
  6. log信息應該包含 "[fileName - function]"前綴 ,Debug時能夠快速定位到出問題的代碼。
  7. 不要亂拋panic,容易導致進程crash。
  8. 任何一個goroutine都應該有recover來保護程序不會因為panic而crash。

注釋Comment Sentences

  1. 每個Go文件的頭部都應該有注釋,注釋標明:作者、時間、功能描述等,頭部注釋格式如下:
// Package demo
// Created by tonyk 2019-09-26
// description...

package demo
...
  1. struct、interface和function注釋應該使用"//"開頭並以"."結束,保証注釋完整,如果是英文注釋則首字必須大寫。
  2. 常數和變數等定義注釋應該使用"//"開頭以"."結束,並且保証注釋句字完整,如果是英文注釋則首字必須大寫。
  3. TODO需要簡單明確,讓開發人員清楚的了解還有什麼待完善的事項。

包引用Imports

  1. 如果引入了三種類型的包:標準庫包、程序內部包、第三方包,建議引用時依照以上的順序並且依照字母升序排列。
    例如:
package main
import (
    "fmt"
    "strings"
    
    "myproject/models"
    "myproject/utils"
    
    "github.com/astaxie/beego"
    "github.com/go-sql-driver/mysql"
)
  1. 不用使用相對路徑引入,使用絕對路徑引用包。
// Bad
import "../net"

// Good
import "github.com/go-sql-driver/mysql"
  1. 不要使用 . 省略引用的包名稱
import (
    "bar/testutil" 
    . "foo"         // Don't do that.
)

宣告Declaring

  1. package命名必須和目錄名保持一致,儘量採用有簡短且有意義的包名,不要和標準庫衝突。
  2. struct、interface、變數和函數的命名採用"駝峰法",並且通過首字母大小寫來控制是否為Public。
  3. 單個函數接口名以"er"作為後綴,例如 type Reader interface {...}
    兩個函數的接口綜合兩個函數名,例如 type WriterFlusher interface {...}
    三個以上的函數接口名稱,命名方式同struct,例如 type Car inteface {...}
  4. const命名全部採用大寫字母,並且用"_"分割。

縮進Indent

縮進的規範準則為保証最小的代碼縮進和代碼可讀性。

// Bad
if err != nil {
    error handling
} else {
    normal code
}

// Good
if err != nil {
    error handling
    return
}
normal code
// Bad
if x, err := f(); err != nil {
    error handling
    return
} else {
    use x
}

// Good
x, err := f()
if err != nil {
    error handling
    return
}
use x

縮寫Initialisms

特殊名詞的縮寫需要按照規範,並且名詞的大小寫一致,例如URLProxy或者urlProxy,不要命名為UrlProxy。

ID的全稱為"Identity Document",不能縮寫為Id,正確的命名方式是appID而不是appId。


上一篇
Day 函數宣告與使用
下一篇
Day12 網路通訊協定
系列文
Golang入門到進階實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言