欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Go代碼規(guī)范梳理

Go代碼規(guī)范(Code Review)

總結(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
}

Crypto Rand

不要使用 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。 避免使用像 utilcommon 、 misc 、 apitypesinterfaces 這樣無意義的包名。

不要Panic

錯誤信息

即使用 fmt.Errorf("something bad") 而不要使用 fmt.Errorf("Something bad")

包的導(dǎo)入

避免包重命名導(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"
)

包的匿名導(dǎo)入

import _ "pkg" 這種導(dǎo)入語句,最好只存在于main.go文件中

Dot 導(dǎo)入

package foo_test

import (
    . "foo"
)

不要在程序中使用 import .。它將使程序更難閱讀

內(nèi)聯(lián)錯誤

不規(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)錯誤處理邏輯,不要縮進(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 indicesreaders的名稱用一個(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)

網(wǎng)站優(yōu)化排名