溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go中變量命名規(guī)則及實(shí)例分析

發(fā)布時(shí)間:2022-01-19 09:10:16 來(lái)源:億速云 閱讀:177 作者:kk 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要為大家分析了Go中變量命名規(guī)則及實(shí)例分析的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì)易懂,操作細(xì)節(jié)合理,具有一定參考價(jià)值。如果感興趣的話,不妨跟著跟隨小編一起來(lái)看看,下面跟著小編一起深入學(xué)習(xí)“Go中變量命名規(guī)則及實(shí)例分析”的知識(shí)吧。

命名習(xí)慣很重要

  • 良好的可讀性是高質(zhì)量代碼的要求之一

  • 良好的命名習(xí)慣有助于提高代碼可讀性

良好命名喜歡的特質(zhì)

Good Name 將具有如下的特質(zhì):

  • Consistent (easy to guess),

  • Short (easy to type),

  • Accurate (easy to understand)

經(jīng)驗(yàn)法則

變量申明與變量使用之間越遠(yuǎn),那么變量名字應(yīng)當(dāng)越長(zhǎng)。

這也解釋了,為什么 for 循環(huán)次數(shù)變量使用 i 作為遍歷用的臨時(shí)變量,而不是語(yǔ)義上更具體的 index 作為變量名。

大小寫(xiě)混用的變量名

我們不應(yīng)該使用 names_with_underscores 作為變量名,而是 namesWithUnderscores 作為變量名。

另一方面,首字母縮略詞,應(yīng)當(dāng)是大寫(xiě),例如 ServeHTTP 以及 IDProcessor。

這被稱為 MixedCase,類似于駝峰原則命名,但是專業(yè)詞匯的首字母縮寫(xiě)均應(yīng)當(dāng)寫(xiě)成大寫(xiě)形式。

變量名避免冗余

變量名不是越長(zhǎng)越好,常變量名會(huì)模糊代碼功能。

常見(jiàn)的常量、類型組合可能使用非常簡(jiǎn)短的名字:

  • 使用 i 而不是 index

  • 使用 r 而不是 reader

  • 使用 b 而不是 buffer

根據(jù)上下文,避免使用冗余的名稱:

  • 在 RuneCount 方法內(nèi)部,使用 count 而不是 reuneCount

  • 在 map 語(yǔ)句中,使用 ok 而不是 keyInMap:

v, ok := m[k]

常變量名也許在長(zhǎng)函數(shù)、有很多變量的函數(shù)中有幫助,但是這通常也意味著你應(yīng)該重構(gòu)代碼。

Bad codes vs good codes

// Bad
func RuneCount(buffer []byte) int {
      // runeCount -> count
    runeCount := 0
      // index -> i , buffer -> b
    for index := 0; index < len(buffer); {
        if buffer[index] < RuneSelf {
            index++
        } else {
              // size -> n
            _, size := DecodeRune(buffer[index:])
            index += size
        }
        runeCount++
    }
    return runeCount
}
// Good
func RuneCount(b []byte) int {
    count := 0
    for i := 0; i < len(b); {
        if b[i] < RuneSelf {
            i++
        } else {
            _, n := DecodeRune(b[i:])
            i += n
        }
        count++
    }
    return count
}

函數(shù)參數(shù)的命名

函數(shù)參數(shù)與變量名一樣,都起到了文檔的作用。

1.當(dāng)函數(shù)參數(shù)的類型具有描述性時(shí),那么函數(shù)參數(shù)名就可以簡(jiǎn)短一些:

func AfterFunc(d Duration, f func()) *Timer
func Escape(w io.Writer, s []byte)

2.當(dāng)函數(shù)參數(shù)的類型語(yǔ)義不清,那么參數(shù)名應(yīng)當(dāng)更具體詳細(xì)一些:

func Unix(sec, nsec int64) Time
func HasPrefix(s, prefix []byte) bool

返回值的命名

導(dǎo)出函數(shù)(exported function)返回值應(yīng)當(dāng)僅僅出于編寫(xiě)文檔目的進(jìn)行命名。

下面是返回值命名的好例子:

// Good
func Copy(dst Writer, src Reader) (written int64, err error)
// Good
func ScanBytes(data []byte, atEOF bool) (advance int, token []byte, err error)

方法 Receiver 的命名

Go 中結(jié)構(gòu)體可以擁有方法,在為結(jié)構(gòu)體聲明方法時(shí),結(jié)構(gòu)體被稱為 receiver。

按照慣例,方法接收者的命名通常為 1 個(gè)字符或者 2 個(gè)字符,因?yàn)榻Y(jié)構(gòu)體的每一個(gè)方法都將使用同一個(gè) receiver 名稱。

// Good
func (b *Buffer) Read(p []byte) (n int, err error)
// Good
func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request)
// Good
func (r Rectangle) Size() Point

Receiver 的名稱一定要確保一致性,如果結(jié)構(gòu)體的 method1 使用 r 作為 receiver 名稱,那么 method2 就不應(yīng)當(dāng)使用 rdr 作為名稱。

導(dǎo)出 package 級(jí)別變量命名

package 級(jí)別的變量已經(jīng)被 package name 限定了,因此需要注意導(dǎo)出變量、常量、函數(shù)、類型名的冗余問(wèn)題。

例如:

  • 我們使用 bytes.Buffer 而不是 bytes.ByteBuffer

  • 我們使用 strings.Reader 而不是 strings.StringReader

導(dǎo)出變量名不要與 package 之間存在冗余。

接口類型

只有一個(gè)方法的接口,接口名通常簡(jiǎn)單在方法后面加上 er 來(lái)進(jìn)行命令,例如:

type Reader interface {
    Read(p []byte) (n int, err error)
}

有時(shí)候,上述策略會(huì)導(dǎo)致接口名語(yǔ)法不正確,但是我們?nèi)匀豢梢赃x擇這么做,例如:

type Execer interface {
    Exec(query string, args []Value) (Result, error)
}

也有時(shí)候,我們會(huì)修改接口名,使得其符合英語(yǔ)語(yǔ)法:

type ByteReader interface {
    ReadByte() (c byte, err error)
}

當(dāng)一個(gè)接口包含多個(gè)方法時(shí),應(yīng)當(dāng)選擇一個(gè)準(zhǔn)確描述其用途的名稱,例如 net.Conn,http.ResponseWriter,io.ReadWriter。

error 命名

錯(cuò)誤類型與錯(cuò)誤變量應(yīng)當(dāng)有不同的命名格式:

// 錯(cuò)誤類型 Error types
type ExitError struct {
    ...
}
// 錯(cuò)誤變量 Error values
var ErrFormat = errors.New("image: unknown format")

Packages 名

選擇對(duì)導(dǎo)出的名稱具有意義的包名稱。

避免使用 util、common 等包名。

結(jié)論

使用短變量名

變量取名考慮上下文,避免冗余,例如函數(shù)內(nèi)的局部變量考慮函數(shù)名,包導(dǎo)出變量考慮包名

什么是go

go是golang的簡(jiǎn)稱,golang 是Google開(kāi)發(fā)的一種靜態(tài)強(qiáng)類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語(yǔ)言,其語(yǔ)法與 C語(yǔ)言相近,但并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數(shù)等功能。

關(guān)于“Go中變量命名規(guī)則及實(shí)例分析”就介紹到這了,更多相關(guān)內(nèi)容可以搜索億速云以前的文章,希望能夠幫助大家答疑解惑,請(qǐng)多多支持億速云網(wǎng)站!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎ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)容。

AI