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