一文了解Go語言中編碼規(guī)范的使用
每個語言都有自己特色的編碼規(guī)范,學習該語言的命名規(guī)范,能讓你寫出來的代碼更加易讀,更加不容易出現(xiàn)一些低級錯誤。
本文根據(jù)個人編碼習慣以及網(wǎng)絡上的一些文章,整理了一些大家能用上的編碼規(guī)范,可能是一些主流方案,但不代表官方,這一點先聲明一下。
1. 文件命名
由于 Windows平臺文件名不區(qū)分大小寫,所以文件名應一律使用小寫
不同單詞之間用下劃線分詞,不要使用駝峰式命名
如果是測試文件,可以以 _test.go 結(jié)尾
文件若具有平臺特性,應以 文件名_平臺.go 命名,比如 utils_ windows.go,utils_linux.go,可用的平臺有:windows, unix, posix, plan9, darwin, bsd, linux, freebsd, nacl, netbsd, openbsd, solaris, dragonfly, bsd, notbsd, android,stubs
一般情況下應用的主入口應為 main.go,或者以應用的全小寫形式命名。比如MyBlog 的入口可以為 myblog.go
2. 常量命名
目前在網(wǎng)絡上可以看到主要有兩種風格的寫法
第一種是駝峰命名法,比如 appVersion
第二種使用全大寫且用下劃線分詞,比如 APP_VERSION
這兩種風格,沒有孰好孰弱,可自由選取,我個人更傾向于使用第二種,主要是能一眼與變量區(qū)分開來。
如果要定義多個變量,請使用 括號 來組織。
const ( APP_VERSION = "0.1.0" CONF_PATH = "/etc/xx.conf" )
3. 變量命名
和常量不同,變量的命名,開發(fā)者們的喜好就比較一致了,統(tǒng)一使用 駝峰命名法
- 在相對簡單的環(huán)境(對象數(shù)量少、針對性強)中,可以將完整單詞簡寫為單個字母,例如:user寫為u
- 若該變量為 bool 類型,則名稱應以 Has, Is, Can 或 Allow 開頭。例如:isExist ,hasConflict 。
- 其他一般情況下首單詞全小寫,其后各單詞首字母大寫。例如:numShips 和 startDate 。
- 若變量中有特有名詞(以下列出),且變量為私有,則首單詞還是使用全小寫,如 apiClient。
- 若變量中有特有名詞(以下列出),但變量不是私有,那首單詞就要變成全大寫。例如:APIClient,URLString
這里列舉了一些常見的特有名詞:
// A GonicMapper that contains a list of common initialisms taken from golang/lint var LintGonicMapper = GonicMapper{ "API": true, "ASCII": true, "CPU": true, "CSS": true, "DNS": true, "EOF": true, "GUID": true, "HTML": true, "HTTP": true, "HTTPS": true, "ID": true, "IP": true, "JSON": true, "LHS": true, "QPS": true, "RAM": true, "RHS": true, "RPC": true, "SLA": true, "SMTP": true, "SSH": true, "TLS": true, "TTL": true, "UI": true, "UID": true, "UUID": true, "URI": true, "URL": true, "UTF8": true, "VM": true, "XML": true, "XSRF": true, "XSS": true, }
4. 函數(shù)命名
- 函數(shù)名還是使用 駝峰命名法
- 但是有一點需要注意,在 Golang 中是用大小寫來控制函數(shù)的可見性,因此當你需要在包外訪問,請使用 大寫字母開頭
- 當你不需要在包外訪問,請使用小寫字母開頭
另外,函數(shù)內(nèi)部的參數(shù)的排列順序也有幾點原則
- 參數(shù)的重要程度越高,應排在越前面
- 簡單的類型應優(yōu)先復雜類型
- 盡可能將同種類型的參數(shù)放在相鄰位置,則只需寫一次類型
5. 接口命名
使用駝峰命名法,可以用 type alias 來定義大寫開頭的 type 給包外訪問。
type helloWorld interface { func Hello(); } type SayHello helloWorld
當你的接口只有一個函數(shù)時,接口名通常會以 er 為后綴
type Reader interface { Read(p []byte) (n int, err error) }
5. 注釋規(guī)范
注釋分為
5.1 包注釋
位于 package 之前,如果一個包有多個文件,只需要在一個文件中編寫即可
如果你想在每個文件中的頭部加上注釋,需要在版權注釋和 Package前面加一個空行,否則版權注釋會作為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 net
如果是特別復雜的包,可單獨創(chuàng)建 doc.go 文件說明
5.2 代碼注釋
用于解釋代碼邏輯,可以有兩種寫法
單行注釋使用 // ,多行注釋使用 /* comment */
// 單行注釋 /* 多 行 注 釋 */
另外,對于代碼注釋還有一些更加苛刻的要求,這個看個人了,摘自網(wǎng)絡:
所有導出對象都需要注釋說明其用途;非導出對象根據(jù)情況進行注釋。
如果對象可數(shù)且無明確指定數(shù)量的情況下,一律使用單數(shù)形式和一般進行時描述;否則使用復數(shù)形式。
包、函數(shù)、方法和類型的注釋說明都是一個完整的句子。
句子類型的注釋首字母均需大寫;短語類型的注釋首字母需小寫。
注釋的單行長度不能超過 80 個字符。
類型的定義一般都以單數(shù)形式描述:
// Request represents a request to run a command. type Request struct { ...
如果為接口,則一般以以下形式描述:
// FileInfo is the interface that describes a file and is returned by Stat and Lstat. type FileInfo interface { ...
函數(shù)與方法的注釋需以函數(shù)或方法的名稱作為開頭:
// Post returns *BeegoHttpRequest with POST method.
如果一句話不足以說明全部問題,則可換行繼續(xù)進行更加細致的描述:
// Copy copies file from source to target path. // It returns false and error when error occurs in underlying function calls.
若函數(shù)或方法為判斷類型(返回值主要為 bool 類型),則以 <name> returns true if 開頭:
// HasPrefix returns true if name has any string in given slice as prefix. func HasPrefix(name string, prefixes []string) bool { ...
5.3 特別注釋
- TODO:提醒維護人員此部分代碼待完成
- FIXME:提醒維護人員此處有BUG待修復
- NOTE:維護人員要關注的一些問題說明
6. 包的導入
單行的包導入
import "fmt"
多個包導入,請使用 {} 來組織
import { "fmt" "os" }
另外根據(jù)包的來源,對排版還有一定的要求
標準庫排最前面,第三方包次之、項目內(nèi)的其它包和當前包的子包排最后,每種分類以一空行分隔。
盡量不要使用相對路徑來導入包。
import ( "fmt" "html/template" "net/http" "os" "github.com/codegangsta/cli" "gopkg.in/macaron.v1" "github.com/gogits/git" "github.com/gogits/gfm" "github.com/gogits/gogs/routers" "github.com/gogits/gogs/routers/repo" "github.com/gogits/gogs/routers/user" )
7. 善用 gofmt
除了命名規(guī)范外,Go 還有很多格式上的規(guī)范,比如
- 使用 tab 進行縮進
- 一行最長不要超過 80 個字符
因此在格式上的問題,你大部分都可以放心交由 gofmt 幫你調(diào)整。關于 gofmt 的文章還在寫,應該這兩天就會更新。你可以過兩天再來看看。
參考文章:
到此這篇關于一文了解Go語言中編碼規(guī)范的使用的文章就介紹到這了,更多相關Go語言編碼規(guī)范內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!