Go 学习笔记(70)— Go 变量声明、变量初始化、值类型变量赋值、指针类型变量赋值
1. 變量聲明
要單純聲明一個(gè)變量,可以通過 var 關(guān)鍵字,如下所示:
var s string
該示例只是聲明了一個(gè)變量 s,類型為 string,并沒有對(duì)它進(jìn)行初始化,所以它的值為 string 的零值,也就是 “”(空字符串)。
來聲明一個(gè)指針類型的變量試試,如下所示:
var sp *string
發(fā)現(xiàn)也是可以的,但是它同樣沒有被初始化,所以它的值是 *string 類型的零值,也就是 nil。
2. 變量初始化
變量可以通過 = 運(yùn)算符賦值,也就是修改變量的值。如果在聲明一個(gè)變量的時(shí)候就給這個(gè)變量賦值,這種操作就稱為變量的初始化。
如果要對(duì)一個(gè)變量初始化,可以有三種辦法。
- 聲明時(shí)直接初始化
var s string = "hello"
- 聲明后再進(jìn)行初始化
var s string
s = "hello"
- 使用
:=簡單聲明
s := "hello"
3. 不同類型變量賦值
3.1 值類型變量
func main() {var s strings = "hello"fmt.Println(s)
}
運(yùn)行以上代碼,可以正常打印,說明值類型的變量沒有初始化時(shí),直接賦值是沒有問題的。
3.2 指針類型的變量呢
func main() {var sp *string*sp = "hello"fmt.Println(*sp)
}
運(yùn)行這些代碼,你會(huì)看到如下錯(cuò)誤信息:
panic: runtime error: invalid memory address or nil pointer dereference
這是因?yàn)橹羔橆愋偷淖兞咳绻麤]有分配內(nèi)存,就默認(rèn)是零值 nil,它沒有指向的內(nèi)存,所以無法使用,強(qiáng)行使用就會(huì)得到以上 nil 指針錯(cuò)誤。
而對(duì)于值類型來說,即使只聲明一個(gè)變量,沒有對(duì)其初始化,該變量也會(huì)有分配好的內(nèi)存。
在下面的示例中,聲明了一個(gè)變量 s,并沒有對(duì)其初始化,但是可以通過 &s 獲取它的內(nèi)存地址。這其實(shí)是 Go 語言幫我們做的,可以直接使用。
func main() {var s stringfmt.Printf("%p\n",&s)
}
為什么 var wg sync.WaitGroup 聲明的變量 wg 不進(jìn)行初始化也可以直接使用?
因?yàn)?sync.WaitGroup 是一個(gè) struct 結(jié)構(gòu)體,是一個(gè)值類型,Go 語言自動(dòng)分配了內(nèi)存,所以可以直接使用,不會(huì)報(bào) nil 異常。
總結(jié): 如果要對(duì)一個(gè)變量賦值,這個(gè)變量必須有對(duì)應(yīng)的分配好的內(nèi)存,這樣才可以對(duì)這塊內(nèi)存操作,完成賦值的目的。
注意:其實(shí)不止賦值操作,對(duì)于指針變量,如果沒有分配內(nèi)存,取值操作一樣會(huì)報(bào)
nil異常,因?yàn)闆]有可以操作的內(nèi)存。
所以一個(gè)變量必須要經(jīng)過聲明、內(nèi)存分配才能賦值,才可以在聲明的時(shí)候進(jìn)行初始化。指針類型在聲明的時(shí)候,Go 語言并沒有自動(dòng)分配內(nèi)存,所以不能對(duì)其進(jìn)行賦值操作,這和值類型不一樣。
所以 map 和 chan 也一樣,因?yàn)樗鼈儽举|(zhì)上也是指針類型。
func main() {var d map[string]stringd["aa"] = "123"fmt.Printf("%v\n", d)
}
報(bào)錯(cuò):
panic: assignment to entry in nil map
總結(jié)
以上是生活随笔為你收集整理的Go 学习笔记(70)— Go 变量声明、变量初始化、值类型变量赋值、指针类型变量赋值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国清水混凝土行业供
- 下一篇: 2022-2028年中国聚硫橡胶行业市场