宣告變數 Go 語言設計哲學之七 變數宣告須一致

2021-10-25 13:07:57 字數 3230 閱讀 6665

go 語言,使用變數之前需要先進行變數的宣告。

var s string = 「golang"n := 666
go 語言有兩類變數

包級別(package varible):在 package 級別可見的變數。如果是匯出變數,該變數也可以被視為全域性變數;

區域性變數(local varible):函式或方法體內宣告的變數,僅在函式或方法體內可見。

1. 包級別變數

包級變數使用var 關鍵字的變數宣告形式,從變數宣告的時候是否延遲初始化這個角度對包級變數進行一次分類。

1). 宣告並同時顯式初始化

//$goroot/src/io/pipe.govar errclosedpipe = errors.new("io: read/write on closed pipe")//$goroot/src/io/io.govar eof = errors.new("eof」)
上面,對於變數宣告的同時進行顯式初始化的這類包級變數,格式:

var 變數名 = 初始化表示式

編譯器會自動根據等號右側 初始化表示式 結果值的型別確定左側宣告的變數的型別。

var num = 16var pi = 3.14
go 會為包級變數設定預設型別,對於未顯式賦予型別的整型變數 num,編譯器會設定預設型別 int;而浮點型變數 pi 的預設型別則為 float64。如果不想使用預設型別,而是要顯式為 num 和 pi 指定型別。

var num = int32(16)var pi  = float64(3.14)
上面是預設型別和顯式指定型別兩種宣告形式,尤其是在將這些變數放在乙個 var 塊中宣告時

var (  num = 17  pi = float32(3.14))
2). 延遲初始化有時候,宣告並不立即顯式初始化的包級變數,雖然沒有顯式初始化,go 語言也會讓這些變數擁有初始的「零值」。如果是自定義的型別,保證其零值可用是非常必要的,形式如下:

var a int32var f float64
3). 宣告聚類與就近原則go 語言提供 var 塊用於將多於乙個的變數宣告放在一起,我們習慣:

1 將同一類的變數宣告放在乙個 var 塊中,不同類的宣告放在不同的 var 塊中;

2 將延遲初始化的變數宣告放在乙個 var 塊,而將宣告且顯式初始化的變數放在另乙個 var 塊中。

go 標準庫中的**:

// $goroot/src/net/http/server.govar (    bufioreaderpool   sync.pool    bufiowriter2kpool sync.pool    bufiowriter4kpool sync.pool)var copybufpool = sync.pool ,}
copybufpool 變數沒有放入 var 塊就是因為它的宣告是帶有顯式初始化的,而 var 塊中的變數宣告都是延遲初始化的

// $goroot/src/net/net.govar (    alongtimeago = time.unix(1, 0)    nodeadline = time.time{}    nocancel   = (chan struct{})(nil))var threadlimit chan struct{}
threadlimit 單獨放在 var 塊外面,它是延遲初始化的變數宣告,它與以上的 var 塊中時間限制的變數也有所不同。

變數宣告最佳實踐中還有乙個原則-就近原則,如果乙個包級變數在包內部多處使用,放在原始檔頭部宣告比較恰當直觀。

/ $goroot/src/net/http/request.govar errnocookie = errors.new("http: named cookie not present")func (r *request) cookie(name string) (*cookie, error)     return nil, errnocookie}
2. 區域性變數的宣告形式比上面的包級別變數,區域性變數多了短變數宣告形式,區域性變數採用最多的一種宣告形式。

對於延遲初始化的區域性變數宣告,用帶有 var 的宣告形式。

// $goroot/src/strings/replace.gofunc (r *bytereplacer) replace(s string) string       buf[i] = r[b]    }  }  if buf == nil   return string(buf)}
var err error  這也是我們日常常見的宣告方式

短變數宣告形式是區域性變數最常用的宣告形式,在 go 標準庫**中廣泛使用。 

num := 17             //預設型別pi := float32(3.14)   //顯示轉型
// $goroot/src/net/net.gofunc (v *buffers) writeto(w io.writer) (n int64, err error)     for _, b := range *v     }    v.consume(n)    return n, nil}
我們看到go源**net中,if wv, ok := w.(bufferswriter); ok和for _, b := range *v都使用了短變數宣告形式,這也體現出「就近」原則,讓變數的作用域最小化。

設計良好的函式/方法的原則是「單一職責」,因此每個函式/方法規模都不大,很少需要應用 var 塊來宣告區域性變數,如果你在宣告區域性變數時遇到這種場景,那就使用 var 塊來宣告多於乙個的區域性變數吧。看一下go標準庫中的源**是這麼使用的:

Go語言變數宣告

匿名變數 複數型別 bool型別 字元型別 資料型別轉換 指標型別 常量iota常量生成器 字串與數值型別的轉換 var name type type是型別 bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 ...

Go語言示例 3變數宣告

variables.go源 定義字串型別自變數。package main import fmt func main 解釋執行。go run variables.go initial variables.go源 定義整數型自變數。package main import fmt func main 解釋...

go語言變數的宣告與賦值

var 變數名 變數型別var a int b string c float32 d func bool e struct var a int var b string var c float32 var d func bool var e struct整型和浮點型變數的預設值為 0。字串變數的預設...