Go語言的常量與變量使用注意事項

一、變量

Go是靜態類型,不能在運行期改變變量的類型。

面試題

關於全局變量的初始化,下面正確的使用方式是

A、var i int = 10

B、var i = 10

C、i := 10

這是一個關於Go語言全局變量聲明和賦值的考察,Go語言中的變量聲明使用關鍵字var,例如:

var str string //聲明變量

str = “test” //給變量賦值

這邊var是定義變量的關鍵字,str是變量名稱,string是變量類型,=是賦值符號,”test”是值。上面的程序分兩步,第一步聲明變量,第二步給變量賦值。也可以將兩步合到一起。

var str string = “test”

使用關鍵字 var 定義變量,自動初始化為零值。如果提供初始化值,可省略變量類型,由編譯器自動推斷:

var str = “test”

Go語言還提供了一種更簡短的寫法:

str := “test”

相當於先執行了var str string定義了str變量,再執行str = “test”的賦值操作。

Go語言全局變量不支持在函數外進行賦值,如:

var str string //定義了一個全局變量str

str = “test” //全局變量不支持這種操作

因此,全局變量不支持 str := “test”操作,此方法只支持局部變量操作。

func main() {

x := 123 // 注意檢查,是定義新局部變量,還是修改全局變量。該⽅ >方式容易造成錯誤。

}

可一次定義多個變量:

var x, y, z int

var s, n = “abc”, 123

var (

a int

b float32

)

func main() {

i, s := 123, “Hello, World!”

println(x, s, n)

}

多變量賦值時,先計算所有相關值,然後再從左到右依次賦值。

data, i := [3]int{0, 1, 2}, 0

i, data[i] = 2, 100 // (i = 0) -> (i = 2), (data[0] = 100)

全局變量還支持若某個變量需要依賴其它變量,則被依賴的變量先初始化

var test1 = test2

var test2 = “test2”

二、常量

常量值必須是編譯期可確定的數字、字符串、布爾值。

const x, y int = 1, 2 // 多常量初始化

const s = “Hello, World!” // 類型推斷

const ( // 常量組

a, b = 10, 100

c bool = false

)

Go語言中當定義一個局部變量未使用會編譯錯誤,但是局部常量未使用不會引發編譯錯誤。

在常量組中,如不提供類型和初始化值,那麼視作與上一常量值相同。

const (

s = “abc”

x // x = “abc”

)

常量值還可以是 len、cap、unsafe.Sizeof 等編譯期可確定結果的函數返回值。

const (

a = “abc”

b = len(a)

c = unsafe.Sizeof(b)

)

如果常量類型足以存儲初始化值,那麼不會引發溢出錯誤。

const (

a byte = 100 // int to byte

b int = 1e20 // float64 to int, overflows

)

面試題:

對於常量定義zero(const zero = 0.0),zero是浮點型常量,這一說話時候正確。(false)

Go語言常量有個不同尋常的地方,雖然一個常量可以有任意一個確定的類型,例如int或float64,但是很多常量卻並沒有一個明確的基礎類型,編譯器為這些沒有明確的基礎類型的數字變量提供了比基礎類型更高的算術運算。有六種未明確類型的變量類型,分別是無類型的布爾型,無類型的整數,無類型的字符,無類型的浮點數,無類型的複數,無類型的字符串。

枚舉

關鍵字 iota 定義常量組中從 0 開始按行計數的自增枚舉值。

const (

Sunday = iota // 0

Monday // 1,通常省略後續⾏行表達式。

Tuesday // 2

Wednesday // 3

Thursday // 4

Friday // 5

Saturday // 6

)

const (

= iota // iota = 0

KB int64 = 1 << (10 iota) // iota = 1

MB // 與 KB 表達式相同,但 iota = 2

GB

TB

)

MB,GB,TB會表達式與KB相同,都為1<

同樣的道理:

const (

i =1<<iota>

j=3<<iota>

k

l)

/<iota>

/<iota>

i = 1,j=6,k=12,I=24。

iota每出現一次,自動加1;而前面的操作數如果不指定,默認使用上一個的,在這裡是3。則k=3<<2,I=3<<3。

如果 iota ⾃自增被打斷,須顯式恢復。

const (

A = iota // 0

B // 1

C = “c” // c

D // c,與上⼀一⾏行相同。

E = iota // 4,顯式恢復。注意計數包含了 C、D 兩⾏行。

F // 5

)

需要注意的是E=4,顯式恢復。


分享到:


相關文章: