您好,登錄后才能下訂單哦!
本篇文章為大家展示了golang語(yǔ)言的編碼規(guī)范有哪些,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
一、 命名規(guī)范
命名是代碼規(guī)范中很重要的一部分,統(tǒng)一的命名規(guī)則有利于提高的代碼的可讀性,好的命名僅僅通過(guò)命名就可以獲取到足夠多的信息。
Go在命名時(shí)以字母a到Z或a到Z或下劃線(xiàn)開(kāi)頭,后面跟著零或更多的字母、下劃線(xiàn)和數(shù)字(0到9)。Go不允許在命名時(shí)中使用@、$和%等標(biāo)點(diǎn)符號(hào)。Go是一種區(qū)分大小寫(xiě)的編程語(yǔ)言。因此,Manpower和manpower是兩個(gè)不同的命名。
當(dāng)命名(包括常量、變量、類(lèi)型、函數(shù)名、結(jié)構(gòu)字段等等)以一個(gè)大寫(xiě)字母開(kāi)頭,如:Group1,那么使用這種形式的標(biāo)識(shí)符的對(duì)象就可以被外部包的代碼所使用(客戶(hù)端程序需要先導(dǎo)入這個(gè)包),這被稱(chēng)為導(dǎo)出(像面向?qū)ο笳Z(yǔ)言中的 public);
命名如果以小寫(xiě)字母開(kāi)頭,則對(duì)包外是不可見(jiàn)的,但是他們?cè)谡麄€(gè)包的內(nèi)部是可見(jiàn)并且可用的(像面向?qū)ο笳Z(yǔ)言中的 private )
1、包命名:package
保持package的名字和目錄保持一致,盡量采取有意義的包名,簡(jiǎn)短,有意義,盡量和標(biāo)準(zhǔn)庫(kù)不要沖突。包名應(yīng)該為小寫(xiě)單詞,不要使用下劃線(xiàn)或者混合大小寫(xiě)。
package demo package main
2、 文件命名
盡量采取有意義的文件名,簡(jiǎn)短,有意義,應(yīng)該為小寫(xiě)單詞,使用下劃線(xiàn)分隔各個(gè)單詞。
my_test.go
3、 結(jié)構(gòu)體命名
采用駝峰命名法,首字母根據(jù)訪(fǎng)問(wèn)控制大寫(xiě)或者小寫(xiě)
struct 申明和初始化格式采用多行,例如下面:
// 多行申明 type User struct{ Username string Email string } // 多行初始化 u := User{ Username: "astaxie", Email: "astaxie@gmail.com", }
4、 接口命名
命名規(guī)則基本和上面的結(jié)構(gòu)體類(lèi)型
單個(gè)函數(shù)的結(jié)構(gòu)名以 “er” 作為后綴,例如 Reader , Writer 。
type Reader interface { Read(p []byte) (n int, err error) }
5、變量命名
和結(jié)構(gòu)體類(lèi)似,變量名稱(chēng)一般遵循駝峰法,首字母根據(jù)訪(fǎng)問(wèn)控制原則大寫(xiě)或者小寫(xiě),但遇到特有名詞時(shí),需要遵循以下規(guī)則:
如果變量為私有,且特有名詞為首個(gè)單詞,則使用小寫(xiě),如 apiClient
其它情況都應(yīng)當(dāng)使用該名詞原有的寫(xiě)法,如 APIClient、repoID、UserID
錯(cuò)誤示例:UrlArray,應(yīng)該寫(xiě)成 urlArray 或者 URLArray
若變量類(lèi)型為 bool 類(lèi)型,則名稱(chēng)應(yīng)以 Has, Is, Can 或 Allow 開(kāi)頭
var isExist bool var hasConflict bool var canManage bool var allowGitHook bool
6、常量命名
常量均需使用全部大寫(xiě)字母組成,并使用下劃線(xiàn)分詞
const APP_VER = "1.0"
如果是枚舉類(lèi)型的常量,需要先創(chuàng)建相應(yīng)類(lèi)型:
type Scheme string const ( HTTP Scheme = "http" HTTPS Scheme = "https" )
7、 關(guān)鍵字
下面的列表顯示了Go中的保留字。這些保留字不能用作常量或變量或任何其他標(biāo)識(shí)符名稱(chēng)。
二、注釋
Go提供C風(fēng)格的/* */塊注釋和C ++風(fēng)格的//行注釋。行注釋是常態(tài);塊注釋主要顯示為包注釋?zhuān)诒磉_(dá)式中很有用或禁用大量代碼。
單行注釋是最常見(jiàn)的注釋形式,你可以在任何地方使用以 // 開(kāi)頭的單行注釋
多行注釋也叫塊注釋?zhuān)岩?/* 開(kāi)頭,并以 */ 結(jié)尾,且不可以嵌套使用,多行注釋一般用于包的文檔描述或注釋成塊的代碼片段
go 語(yǔ)言自帶的 godoc 工具可以根據(jù)注釋生成文檔,生成可以自動(dòng)生成對(duì)應(yīng)的網(wǎng)站( golang.org 就是使用 godoc 工具直接生成的),注釋的質(zhì)量決定了生成的文檔的質(zhì)量。每個(gè)包都應(yīng)該有一個(gè)包注釋?zhuān)趐ackage子句之前有一個(gè)塊注釋。對(duì)于多文件包,包注釋只需要存在于一個(gè)文件中,任何一個(gè)都可以。包評(píng)論應(yīng)該介紹包,并提供與整個(gè)包相關(guān)的信息。它將首先出現(xiàn)在godoc頁(yè)面上,并應(yīng)設(shè)置下面的詳細(xì)文檔。
詳細(xì)的如何寫(xiě)注釋可以
參考:http://golang.org/doc/effective_go.html#commentary
1、包注釋
每個(gè)包都應(yīng)該有一個(gè)包注釋?zhuān)粋€(gè)位于package子句之前的塊注釋或行注釋。包如果有多個(gè)go文件,只需要出現(xiàn)在一個(gè)go文件中(一般是和包同名的文件)即可。 包注釋?xiě)?yīng)該包含下面基本信息(請(qǐng)嚴(yán)格按照這個(gè)順序,簡(jiǎn)介,創(chuàng)建人,創(chuàng)建時(shí)間):
包的基本簡(jiǎn)介(包名,簡(jiǎn)介)
創(chuàng)建者,格式: 創(chuàng)建人: rtx 名
創(chuàng)建時(shí)間,格式:創(chuàng)建時(shí)間: yyyyMMdd
例如 util 包的注釋示例如下
// util 包, 該包包含了項(xiàng)目共用的一些常量,封裝了項(xiàng)目中一些共用函數(shù)。 // 創(chuàng)建人: hanru // 創(chuàng)建時(shí)間: 20190419
2、結(jié)構(gòu)(接口)注釋
每個(gè)自定義的結(jié)構(gòu)體或者接口都應(yīng)該有注釋說(shuō)明,該注釋對(duì)結(jié)構(gòu)進(jìn)行簡(jiǎn)要介紹,放在結(jié)構(gòu)體定義的前一行,格式為: 結(jié)構(gòu)體名, 結(jié)構(gòu)體說(shuō)明。同時(shí)結(jié)構(gòu)體內(nèi)的每個(gè)成員變量都要有說(shuō)明,該說(shuō)明放在成員變量的后面(注意對(duì)齊),實(shí)例如下:
// User , 用戶(hù)對(duì)象,定義了用戶(hù)的基礎(chǔ)信息 type User struct{ Username string // 用戶(hù)名 Email string // 郵箱 }
3、函數(shù)(方法)注釋
每個(gè)函數(shù),或者方法(結(jié)構(gòu)體或者接口下的函數(shù)稱(chēng)為方法)都應(yīng)該有注釋說(shuō)明,函數(shù)的注釋?xiě)?yīng)該包括三個(gè)方面(嚴(yán)格按照此順序撰寫(xiě)):
簡(jiǎn)要說(shuō)明,格式說(shuō)明:以函數(shù)名開(kāi)頭,“,”分隔說(shuō)明部分
參數(shù)列表:每行一個(gè)參數(shù),參數(shù)名開(kāi)頭,“,”分隔說(shuō)明部分
返回值: 每行一個(gè)返回值
示例如下:
// NewtAttrModel , 屬性數(shù)據(jù)層操作類(lèi)的工廠(chǎng)方法 // 參數(shù): // ctx : 上下文信息 // 返回值: // 屬性操作類(lèi)指針 func NewAttrModel(ctx *common.Context) *AttrModel { }
4、代碼邏輯注釋
對(duì)于一些關(guān)鍵位置的代碼邏輯,或者局部較為復(fù)雜的邏輯,需要有相應(yīng)的邏輯說(shuō)明,方便其他開(kāi)發(fā)者閱讀該段代碼,實(shí)例如下:
// 從 Redis 中批量讀取屬性,對(duì)于沒(méi)有讀取到的 id , 記錄到一個(gè)數(shù)組里面,準(zhǔn)備從 DB 中讀取 xxxxx xxxxxxx xxxxxxx
5、注釋風(fēng)格
統(tǒng)一使用中文注釋?zhuān)瑢?duì)于中英文字符之間嚴(yán)格使用空格分隔, 這個(gè)不僅僅是中文和英文之間,英文和中文標(biāo)點(diǎn)之間也都要使用空格分隔,例如:
// 從 Redis 中批量讀取屬性,對(duì)于沒(méi)有讀取到的 id , 記錄到一個(gè)數(shù)組里面,準(zhǔn)備從 DB 中讀取
上面 Redis 、 id 、 DB 和其他中文字符之間都是用了空格分隔。
建議全部使用單行注釋
和代碼的規(guī)范一樣,單行注釋不要過(guò)長(zhǎng),禁止超過(guò) 120 字符。
三、代碼風(fēng)格
1、縮進(jìn)和折行
縮進(jìn)直接使用 gofmt 工具格式化即可(gofmt 是使用 tab 縮進(jìn)的);
折行方面,一行最長(zhǎng)不超過(guò)120個(gè)字符,超過(guò)的請(qǐng)使用換行展示,盡量保持格式優(yōu)雅。
我們使用Goland開(kāi)發(fā)工具,可以直接使用快捷鍵:ctrl+alt+L,即可。
2、語(yǔ)句的結(jié)尾
Go語(yǔ)言中是不需要類(lèi)似于Java需要冒號(hào)結(jié)尾,默認(rèn)一行就是一條數(shù)據(jù)
如果你打算將多個(gè)語(yǔ)句寫(xiě)在同一行,它們則必須使用 ;
3、括號(hào)和空格
括號(hào)和空格方面,也可以直接使用 gofmt 工具格式化(go 會(huì)強(qiáng)制左大括號(hào)不換行,換行會(huì)報(bào)語(yǔ)法錯(cuò)誤),所有的運(yùn)算符和操作數(shù)之間要留空格。
// 正確的方式 if a > 0 { } // 錯(cuò)誤的方式 if a>0 // a ,0 和 > 之間應(yīng)該空格 { // 左大括號(hào)不可以換行,會(huì)報(bào)語(yǔ)法錯(cuò)誤 }
4、import 規(guī)范
import在多行的情況下,goimports會(huì)自動(dòng)幫你格式化,但是我們這里還是規(guī)范一下import的一些規(guī)范,如果你在一個(gè)文件里面
引入了一個(gè)package,還是建議采用如下格式:
import ( "fmt" )
如果你的包引入了三種類(lèi)型的包,標(biāo)準(zhǔn)庫(kù)包,程序內(nèi)部包,第三方包,建議采用如下方式進(jìn)行組織你的包:
import ( "encoding/json" "strings" "myproject/models" "myproject/controller" "myproject/utils" "github.com/astaxie/beego" "github.com/go-sql-driver/mysql" )
有順序的引入包,不同的類(lèi)型采用空格分離,第一種實(shí)標(biāo)準(zhǔn)庫(kù),第二是項(xiàng)目包,第三是第三方包。
在項(xiàng)目中不要使用相對(duì)路徑引入包:
// 這是不好的導(dǎo)入 import “../net” // 這是正確的做法 import “github.com/repo/proj/src/net”
但是如果是引入本項(xiàng)目中的其他包,最好使用相對(duì)路徑。
5、錯(cuò)誤處理
錯(cuò)誤處理的原則就是不能丟棄任何有返回err的調(diào)用,不要使用 _ 丟棄,必須全部處理。接收到錯(cuò)誤,要么返回err,或者使用log記錄下來(lái)
盡早return:一旦有錯(cuò)誤發(fā)生,馬上返回
盡量不要使用panic,除非你知道你在做什么
錯(cuò)誤描述如果是英文必須為小寫(xiě),不需要標(biāo)點(diǎn)結(jié)尾
采用獨(dú)立的錯(cuò)誤流進(jìn)行處理
// 錯(cuò)誤寫(xiě)法 if err != nil { // error handling } else { // normal code } // 正確寫(xiě)法 if err != nil { // error handling return // or continue, etc. } // normal code
6、測(cè)試
單元測(cè)試文件名命名規(guī)范為 example_test.go
測(cè)試用例的函數(shù)名稱(chēng)必須以 Test 開(kāi)頭,例如:TestExample
每個(gè)重要的函數(shù)都要首先編寫(xiě)測(cè)試用例,測(cè)試用例和正規(guī)代碼一起提交方便進(jìn)行回歸測(cè)試
四、常用工具
上面提到了很過(guò)規(guī)范, go 語(yǔ)言本身在代碼規(guī)范性這方面也做了很多努力,很多限制都是強(qiáng)制語(yǔ)法要求,例如左大括號(hào)不換行,引用的包或者定義的變量不使用會(huì)報(bào)錯(cuò),此外 go 還是提供了很多好用的工具幫助我們進(jìn)行代碼的規(guī)范,
gofmt
大部分的格式問(wèn)題可以通過(guò)gofmt解決, gofmt 自動(dòng)格式化代碼,保證所有的 go 代碼與官方推薦的格式保持一致,于是所有格式有關(guān)問(wèn)題,都以 gofmt 的結(jié)果為準(zhǔn)。
goimport
我們強(qiáng)烈建議使用 goimport ,該工具在 gofmt 的基礎(chǔ)上增加了自動(dòng)刪除和引入包.
go get golang.org/x/tools/cmd/goimports
go vet
vet工具可以幫我們靜態(tài)分析我們的源碼存在的各種問(wèn)題,例如多余的代碼,提前return的邏輯,struct的tag是否符合標(biāo)準(zhǔn)等。
go get golang.org/x/tools/cmd/vet
使用如下:
go vet .
上述內(nèi)容就是golang語(yǔ)言的編碼規(guī)范有哪些,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。