一搞隐、變量
Go是靜態(tài)類型讼庇,不能在運行期改變變量的類型姻采。
面試題
關(guān)于全局變量的初始化,下面正確的使用方式是
A型诚、var i int = 10
B客燕、var i = 10
C、i := 10
這是一個關(guān)于Go語言全局變量聲明和賦值的考察俺驶,Go語言中的變量聲明使用關(guān)鍵字var幸逆,例如:
var str string //聲明變量
str = "test" //給變量賦值
這邊var是定義變量的關(guān)鍵字,str是變量名稱暮现,string是變量類型还绘,=是賦值符號,"test"是值栖袋。上面的程序分兩步拍顷,第一步聲明變量,第二步給變量賦值塘幅。也可以將兩步合到一起昔案。
var str string = "test"
使用關(guān)鍵字 var 定義變量,自動初始化為零值电媳。如果提供初始化值踏揣,可省略變量類型,由編譯器自動推斷:
var str = "test"
Go語言還提供了一種更簡短的寫法:
str := "test"
相當(dāng)于先執(zhí)行了var str string定義了str變量匾乓,再執(zhí)行str = "test"的賦值操作捞稿。
Go語言全局變量不支持在函數(shù)外進行賦值,如:
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)
}
多變量賦值時耻涛,先計算所有相關(guā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"
二、常量
常量值必須是編譯期可確定的數(shù)字芒帕、字符串歉嗓、布爾值。
const x, y int = 1, 2 // 多常量初始化
const s = "Hello, World!" // 類型推斷
const ( // 常量組
a, b = 10, 100
c bool = false
)
Go語言中當(dāng)定義一個局部變量未使用會編譯錯誤背蟆,但是局部常量未使用不會引發(fā)編譯錯誤鉴分。
在常量組中,如不提供類型和初始化值带膀,那么視作與上一常量值相同志珍。
const (
s = "abc"
x // x = "abc"
)
常量值還可以是 len、cap垛叨、unsafe.Sizeof 等編譯期可確定結(jié)果的函數(shù)返回值伦糯。
const (
a = "abc"
b = len(a)
c = unsafe.Sizeof(b)
)
如果常量類型足以存儲初始化值,那么不會引發(fā)溢出錯誤。
const (
a byte = 100 // int to byte
b int = 1e20 // float64 to int, overflows
)
面試題:
對于常量定義zero(const zero = 0.0)敛纲,zero是浮點型常量喂击,這一說話時候正確。(false)
Go語言常量有個不同尋常的地方淤翔,雖然一個常量可以有任意一個確定的類型翰绊,例如int或float64,但是很多常量卻并沒有一個明確的基礎(chǔ)類型旁壮,編譯器為這些沒有明確的基礎(chǔ)類型的數(shù)字變量提供了比基礎(chǔ)類型更高的算術(shù)運算监嗜。有六種未明確類型的變量類型,分別是無類型的布爾型抡谐,無類型的整數(shù)裁奇,無類型的字符,無類型的浮點數(shù)麦撵,無類型的復(fù)數(shù)框喳,無類型的字符串。
枚舉
關(guān)鍵字 iota 定義常量組中從 0 開始按行計數(shù)的自增枚舉值厦坛。
const (
Sunday = iota // 0
Monday // 1五垮,通常省略后續(xù)?行表達(dá)式。
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
const (
_ = iota // iota = 0
KB int64 = 1 << (10 * iota) // iota = 1
MB // 與 KB 表達(dá)式相同杜秸,但 iota = 2
GB
TB
)
MB,GB,TB會表達(dá)式與KB相同放仗,都為1<<(10 * _),但是iota會自增
同樣的道理:
const (
i =1<<iota //
j=3<<iota
k
l)
i = 1,j=6,k=12,I=24撬碟。
iota每出現(xiàn)一次诞挨,自動加1;而前面的操作數(shù)如果不指定呢蛤,默認(rèn)使用上一個的惶傻,在這里是3。則k=3<<2其障,I=3<<3银室。
如果 iota ?自增被打斷,須顯式恢復(fù)励翼。
const (
A = iota // 0
B // 1
C = "c" // c
D // c蜈敢,與上?一?行相同。
E = iota // 4汽抚,顯式恢復(fù)抓狭。注意計數(shù)包含了 C、D 兩?行造烁。
F // 5
)
需要注意的是E=4否过,顯式恢復(fù)午笛。