日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Go 学习笔记(70)— Go 变量声明、变量初始化、值类型变量赋值、指针类型变量赋值

發(fā)布時間:2023/11/28 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go 学习笔记(70)— Go 变量声明、变量初始化、值类型变量赋值、指针类型变量赋值 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 變量聲明

要單純聲明一個變量,可以通過 var 關鍵字,如下所示:

var s string

該示例只是聲明了一個變量 s,類型為 string,并沒有對它進行初始化,所以它的值為 string 的零值,也就是 “”(空字符串)。

來聲明一個指針類型的變量試試,如下所示:

var sp *string

發(fā)現(xiàn)也是可以的,但是它同樣沒有被初始化,所以它的值是 *string 類型的零值,也就是 nil

2. 變量初始化

變量可以通過 = 運算符賦值,也就是修改變量的值。如果在聲明一個變量的時候就給這個變量賦值,這種操作就稱為變量的初始化。

如果要對一個變量初始化,可以有三種辦法。

  1. 聲明時直接初始化
var s string = "hello"
  1. 聲明后再進行初始化
var s string
s = "hello"
  1. 使用 := 簡單聲明
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 語言并沒有自動分配內存,所以不能對其進行賦值操作,這和值類型不一樣。

所以 mapchan 也一樣,因為它們本質上也是指針類型。

func main() {var d map[string]stringd["aa"] = "123"fmt.Printf("%v\n", d)
}

報錯:

panic: assignment to entry in nil map

總結

以上是生活随笔為你收集整理的Go 学习笔记(70)— Go 变量声明、变量初始化、值类型变量赋值、指针类型变量赋值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。