總結(jié)幾個(gè)開發(fā)過程中經(jīng)常會犯的代碼規(guī)范錯誤
成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司10余年經(jīng)驗(yàn)成就非凡,專業(yè)從事成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),成都網(wǎng)頁設(shè)計(jì),成都網(wǎng)頁制作,軟文推廣,一元廣告等。10余年來已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:13518219792,我們期待您的來電!
參考鏈接:https://learnku.com/go/wikis/
// Request 表示運(yùn)行命令的請求。
type Request struct { ...
// Encode 將 req 的 JSON 編碼寫入 w 。
func Encode(w io.Writer, req *Request) { ...
大部分使用上下文的函數(shù)都要將其作為第一個(gè)參數(shù)
func F(ctx context.Context, /* 其他參數(shù) */) {}
不建議把上下文作為成員添加到結(jié)構(gòu)類型中
// 不建議寫法
type MyContext struct {
ctx context.Context
}
不要使用 math/rand
來生成密鑰,即使是一次性密鑰。在沒有種子(seed)的情況下,生成器是完全可以被預(yù)測的。請使用 crypto/rand
的 Reader 作為替代
func Key() string {
buf := make([]byte, 16)
_, err := rand.Read(buf)
if err != nil {
panic(err) // 出于隨機(jī)性,永遠(yuǎn)都不會發(fā)生
}
return fmt.Sprintf("%x", buf)
// or hex.EncodeToString(buf)
// or base64.StdEncoding.EncodeToString(buf)
}
func main() {
fmt.Println(Key())
}
//輸出
//4799b801ecfaedb03cf8da
當(dāng)聲明一個(gè)空 slice 時(shí),傾向于用
var t []string
而不是
t := []string{}
前者聲明了一個(gè) nil slice 值,而后者聲明了一個(gè)非 nil 但是零長度的 slice。兩者在功能上等同,len 和 cap 均為零,而 nil slice 是首選的風(fēng)格。
請注意,在部分場景下,首選非 nil 但零長度的切片,例如編碼 JSON 對象時(shí)(nil 切片編碼為 null
,而則 []string{}
可以正確編碼為 JSON array []
)。
/*
Package template implements data-driven templates for generating textual
output such as HTML.
....
*/
package template
如果包很簡單,包注釋可以很簡短。
// Package math provides basic constants and mathematical functions.
package math
對包中名稱的所有引用都將使用包名完成,因此可以從標(biāo)識符中省略該名稱。 例如,如果你正在使用 chubby
包,則不需鍵入 ChubbyFile
,因?yàn)榭蛻舳藭⑵鋵憺?chubby.ChubbyFile
。 相反,命名為 File
的這種方式,客戶端會將它寫為 chubby.File
。 避免使用像 util
、 common
、 misc
、 api
、 types
和 interfaces
這樣無意義的包名。
即使用 fmt.Errorf("something bad")
而不要使用 fmt.Errorf("Something bad")
避免包重命名導(dǎo)入,防止名稱沖突;好的包名稱不需要重命名。如果發(fā)生命名沖突,則更傾向于重命名最接近本地的包或特定于項(xiàng)目的包。
包導(dǎo)入按組進(jìn)行組織,組與組之間有空行。標(biāo)準(zhǔn)庫包始終位于第一組中。
package main
import (
"fmt"
"hash/adler32"
"os"
"appengine/foo"
"appengine/user"
"github.com/foo/bar"
"rsc.io/goversion/version"
)
即 import _ "pkg"
這種導(dǎo)入語句,最好只存在于main.go文件中
package foo_test
import (
. "foo"
)
不要在程序中使用 import .
。它將使程序更難閱讀
不規(guī)范寫法
// 查找返回鍵的值,如果沒有鍵的映射,則返回空字符串。
func Lookup(key string) string
規(guī)范寫法
// 查找并返回鍵的值,如果沒有鍵的映射,則ok = false。
func Lookup(key string) (value string, ok bool)
并有利于寫出更健壯和可讀性更強(qiáng)的代碼:
value, ok := Lookup(key)
if !ok {
return fmt.Errorf("no value for %q", key)
}
return Parse(value)
要縮進(jìn)錯誤處理邏輯,不要縮進(jìn)常規(guī)代碼。這樣可以改進(jìn)代碼的可讀性,讀者可以快速地瀏覽邏輯主干。例如,不要寫:
if x, err := f(); err != nil {
// 錯誤處理
return
} else {
// 使用變量 x
}
相反,應(yīng)該這樣寫:
x, err := f()
if err != nil {
// 錯誤處理
return
}
// 使用變量 x
這樣寫的好處可以增加可讀性
名稱中的單詞是首字母或首字母縮略詞(例如 "URL" 或 "NATO" )需要具有相同的大小寫規(guī)則。例如,"URL" 應(yīng)顯示為 "URL" 或 "url" (如 "urlPony" 或 "URLPony" ),而不是 "Url"。舉個(gè)例子:ServeHTTP 不是 ServeHttp。對于具有多個(gè)初始化 “單詞” 的標(biāo)識符,也應(yīng)當(dāng)顯示為 "xmlHTTPRequest" 或 "XMLHTTPRequest"。
當(dāng) "ID" 是 "identifier" 的縮寫時(shí),此規(guī)則也適用于 "ID" ,因此請寫 "appID" 而不是 "appId"。
protocol buffer 生成的代碼是個(gè)例外,對人和對機(jī)器的要求不能一樣,人編寫的代碼要比機(jī)器編寫的代碼保持更高的標(biāo)準(zhǔn)。
總的來說,Go 的接口要包含在使用方的包里,不應(yīng)該包含在實(shí)現(xiàn)方的包里。實(shí)現(xiàn)方只需要返回具體類型(通常是指針或結(jié)構(gòu)體),這樣一來可以將新方法添加到實(shí)現(xiàn)中,而不需要擴(kuò)展重構(gòu)。
不要在 API 的實(shí)現(xiàn)者端定義 "for mocking" 接口;反而是要定義公開的 API,用真實(shí)的實(shí)現(xiàn)進(jìn)行測試。
不要先定義接口再用它。脫離真實(shí)的使用場景,我們都不能確定一個(gè)接口是否有存在的價(jià)值,更別提設(shè)計(jì)接口的方法了
建議寫法,把接口和接口具體的實(shí)現(xiàn)類分開兩個(gè)go文件
package consumer // consumer_func.go
type Thinger interface { Thing() bool }
func Foo(t Thinger) string { … }
package consumer //consumer.go
type defaultThinger struct{ … }
func (t defaultThinger) Thing() bool { … }
func NewThinger() Thinger { return defaultThinger{ … } }
不規(guī)范寫法
package producer
type Thinger struct{ … }
func (t Thinger) Thing() bool { … }
func NewThinger() Thinger { return Thinger{ … } }
方法接收者的名稱應(yīng)該反映其身份;通常,其類型的一個(gè)或兩個(gè)字母縮寫就足夠了(例如用 "c" 或 "cl" 表示 "client" )。不要使用通用名稱,例如 "me","this" 或 "self",這是面向?qū)ο笳Z言的典型標(biāo)識符,這些標(biāo)識符賦予該方法特殊的含義。
要是把握不準(zhǔn),就用指針。
Go 中的變量名稱盡可能短為妙,言簡意賅,尤其是對于那些處于有限空間中的局部變量更是如此。例如: 用 c 而不是 lineCount
; 用 i
而不是 sliceIndex
。
基本準(zhǔn)則:當(dāng)變量首次被使用時(shí)離聲明的位置越遠(yuǎn),變量名稱必須更具描述性。對于方法接收者的名稱來說,一個(gè)或者兩個(gè)字母就足夠了。普通變量比如 loop indices
、 readers
的名稱用一個(gè)字母(i
, r
)指代就可以。
當(dāng)然,對于一些邏輯比較復(fù)雜的邏輯,或者非常規(guī)事物,或者全局變量則需使用更具描述性的名字。
文章名稱:Go代碼規(guī)范梳理
URL地址:http://chinadenli.net/article22/dsoisjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、ChatGPT、建站公司、App開發(fā)、網(wǎng)站營銷、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)