一文了解Go語(yǔ)言中編碼規(guī)范的使用
每個(gè)語(yǔ)言都有自己特色的編碼規(guī)范,學(xué)習(xí)該語(yǔ)言的命名規(guī)范,能讓你寫(xiě)出來(lái)的代碼更加易讀,更加不容易出現(xiàn)一些低級(jí)錯(cuò)誤。
本文根據(jù)個(gè)人編碼習(xí)慣以及網(wǎng)絡(luò)上的一些文章,整理了一些大家能用上的編碼規(guī)范,可能是一些主流方案,但不代表官方,這一點(diǎn)先聲明一下。
1. 文件命名
由于 Windows平臺(tái)文件名不區(qū)分大小寫(xiě),所以文件名應(yīng)一律使用小寫(xiě)
不同單詞之間用下劃線分詞,不要使用駝峰式命名
如果是測(cè)試文件,可以以 _test.go 結(jié)尾
文件若具有平臺(tái)特性,應(yīng)以 文件名_平臺(tái).go 命名,比如 utils_ windows.go,utils_linux.go,可用的平臺(tái)有:windows, unix, posix, plan9, darwin, bsd, linux, freebsd, nacl, netbsd, openbsd, solaris, dragonfly, bsd, notbsd, android,stubs
一般情況下應(yīng)用的主入口應(yīng)為 main.go,或者以應(yīng)用的全小寫(xiě)形式命名。比如MyBlog 的入口可以為 myblog.go
2. 常量命名
目前在網(wǎng)絡(luò)上可以看到主要有兩種風(fēng)格的寫(xiě)法
第一種是駝峰命名法,比如 appVersion
第二種使用全大寫(xiě)且用下劃線分詞,比如 APP_VERSION
這兩種風(fēng)格,沒(méi)有孰好孰弱,可自由選取,我個(gè)人更傾向于使用第二種,主要是能一眼與變量區(qū)分開(kāi)來(lái)。
如果要定義多個(gè)變量,請(qǐng)使用 括號(hào) 來(lái)組織。
const ( APP_VERSION = "0.1.0" CONF_PATH = "/etc/xx.conf" )
3. 變量命名
和常量不同,變量的命名,開(kāi)發(fā)者們的喜好就比較一致了,統(tǒng)一使用 駝峰命名法
- 在相對(duì)簡(jiǎn)單的環(huán)境(對(duì)象數(shù)量少、針對(duì)性強(qiáng))中,可以將完整單詞簡(jiǎn)寫(xiě)為單個(gè)字母,例如:user寫(xiě)為u
- 若該變量為 bool 類(lèi)型,則名稱(chēng)應(yīng)以 Has, Is, Can 或 Allow 開(kāi)頭。例如:isExist ,hasConflict 。
- 其他一般情況下首單詞全小寫(xiě),其后各單詞首字母大寫(xiě)。例如:numShips 和 startDate 。
- 若變量中有特有名詞(以下列出),且變量為私有,則首單詞還是使用全小寫(xiě),如 apiClient。
- 若變量中有特有名詞(以下列出),但變量不是私有,那首單詞就要變成全大寫(xiě)。例如:APIClient,URLString
這里列舉了一些常見(jiàn)的特有名詞:
// 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ù)名還是使用 駝峰命名法
- 但是有一點(diǎn)需要注意,在 Golang 中是用大小寫(xiě)來(lái)控制函數(shù)的可見(jiàn)性,因此當(dāng)你需要在包外訪問(wèn),請(qǐng)使用 大寫(xiě)字母開(kāi)頭
- 當(dāng)你不需要在包外訪問(wèn),請(qǐng)使用小寫(xiě)字母開(kāi)頭
另外,函數(shù)內(nèi)部的參數(shù)的排列順序也有幾點(diǎn)原則
- 參數(shù)的重要程度越高,應(yīng)排在越前面
- 簡(jiǎn)單的類(lèi)型應(yīng)優(yōu)先復(fù)雜類(lèi)型
- 盡可能將同種類(lèi)型的參數(shù)放在相鄰位置,則只需寫(xiě)一次類(lèi)型
5. 接口命名
使用駝峰命名法,可以用 type alias 來(lái)定義大寫(xiě)開(kāi)頭的 type 給包外訪問(wèn)。
type helloWorld interface { func Hello(); } type SayHello helloWorld
當(dāng)你的接口只有一個(gè)函數(shù)時(shí),接口名通常會(huì)以 er 為后綴
type Reader interface { Read(p []byte) (n int, err error) }
5. 注釋規(guī)范
注釋分為
5.1 包注釋
位于 package 之前,如果一個(gè)包有多個(gè)文件,只需要在一個(gè)文件中編寫(xiě)即可
如果你想在每個(gè)文件中的頭部加上注釋?zhuān)枰诎鏅?quán)注釋和 Package前面加一個(gè)空行,否則版權(quán)注釋會(huì)作為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
如果是特別復(fù)雜的包,可單獨(dú)創(chuàng)建 doc.go 文件說(shuō)明
5.2 代碼注釋
用于解釋代碼邏輯,可以有兩種寫(xiě)法
單行注釋使用 // ,多行注釋使用 /* comment */
// 單行注釋 /* 多 行 注 釋 */
另外,對(duì)于代碼注釋還有一些更加苛刻的要求,這個(gè)看個(gè)人了,摘自網(wǎng)絡(luò):
所有導(dǎo)出對(duì)象都需要注釋說(shuō)明其用途;非導(dǎo)出對(duì)象根據(jù)情況進(jìn)行注釋。
如果對(duì)象可數(shù)且無(wú)明確指定數(shù)量的情況下,一律使用單數(shù)形式和一般進(jìn)行時(shí)描述;否則使用復(fù)數(shù)形式。
包、函數(shù)、方法和類(lèi)型的注釋說(shuō)明都是一個(gè)完整的句子。
句子類(lèi)型的注釋首字母均需大寫(xiě);短語(yǔ)類(lèi)型的注釋首字母需小寫(xiě)。
注釋的單行長(zhǎng)度不能超過(guò) 80 個(gè)字符。
類(lèi)型的定義一般都以單數(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ù)或方法的名稱(chēng)作為開(kāi)頭:
// Post returns *BeegoHttpRequest with POST method.
如果一句話不足以說(shuō)明全部問(wèn)題,則可換行繼續(xù)進(jìn)行更加細(xì)致的描述:
// Copy copies file from source to target path. // It returns false and error when error occurs in underlying function calls.
若函數(shù)或方法為判斷類(lèi)型(返回值主要為 bool 類(lèi)型),則以 <name> returns true if 開(kāi)頭:
// HasPrefix returns true if name has any string in given slice as prefix. func HasPrefix(name string, prefixes []string) bool { ...
5.3 特別注釋
- TODO:提醒維護(hù)人員此部分代碼待完成
- FIXME:提醒維護(hù)人員此處有BUG待修復(fù)
- NOTE:維護(hù)人員要關(guān)注的一些問(wèn)題說(shuō)明
6. 包的導(dǎo)入
單行的包導(dǎo)入
import "fmt"
多個(gè)包導(dǎo)入,請(qǐng)使用 {} 來(lái)組織
import { "fmt" "os" }
另外根據(jù)包的來(lái)源,對(duì)排版還有一定的要求
標(biāo)準(zhǔn)庫(kù)排最前面,第三方包次之、項(xiàng)目?jī)?nèi)的其它包和當(dāng)前包的子包排最后,每種分類(lèi)以一空行分隔。
盡量不要使用相對(duì)路徑來(lái)導(dǎo)入包。
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 進(jìn)行縮進(jìn)
- 一行最長(zhǎng)不要超過(guò) 80 個(gè)字符
因此在格式上的問(wèn)題,你大部分都可以放心交由 gofmt 幫你調(diào)整。關(guān)于 gofmt 的文章還在寫(xiě),應(yīng)該這兩天就會(huì)更新。你可以過(guò)兩天再來(lái)看看。
參考文章:
到此這篇關(guān)于一文了解Go語(yǔ)言中編碼規(guī)范的使用的文章就介紹到這了,更多相關(guān)Go語(yǔ)言編碼規(guī)范內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang如何優(yōu)雅的編寫(xiě)事務(wù)代碼示例
這篇文章主要介紹了golang如何優(yōu)雅的編寫(xiě)事務(wù)代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05用go寫(xiě)的五子棋預(yù)測(cè)算法的實(shí)現(xiàn)
這篇文章主要介紹了用go寫(xiě)的五子棋預(yù)測(cè)算法的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Go單體服務(wù)開(kāi)發(fā)最佳實(shí)踐總結(jié)
這篇文章主要介紹了Go單體服務(wù)開(kāi)發(fā)最佳實(shí)踐,通過(guò)本文詳細(xì)跟大家分享一下如何使用?go-zero?快速開(kāi)發(fā)一個(gè)有多個(gè)模塊的單體服務(wù),需要的朋友可以參考下2022-04-04Go語(yǔ)言實(shí)現(xiàn)請(qǐng)求超時(shí)處理的方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中實(shí)現(xiàn)請(qǐng)求的超時(shí)控制的方法,主要是通過(guò)timer和timerCtx來(lái)實(shí)現(xiàn)請(qǐng)求的超時(shí)控制,希望對(duì)大家有所幫助2023-05-05Golang 操作TSV文件的實(shí)戰(zhàn)示例
本文主要介紹了Golang 操作TSV文件的實(shí)戰(zhàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Go中使用操作符進(jìn)行數(shù)學(xué)運(yùn)算的示例代碼
在編程中有效地執(zhí)行數(shù)學(xué)運(yùn)算是一項(xiàng)需要開(kāi)發(fā)的重要技能,本文主要介紹了Go中使用操作符進(jìn)行數(shù)學(xué)運(yùn)算的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10