第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

地圖類型是引用類型。var m map[string]int 不指向已初始化的映射。這是什么意思?

地圖類型是引用類型。var m map[string]int 不指向已初始化的映射。這是什么意思?

Go
30秒到達戰(zhàn)場 2022-01-17 10:26:01
我在 golang 博客上讀過:https ://blog.golang.org/go-maps-in-action:var m map[string]int映射類型是引用類型,如指針或切片,所以上面 m 的值為 nil;它不指向初始化的地圖。讀取時,nil 映射的行為類似于空映射,但嘗試寫入 nil 映射會導致運行時恐慌;不要那樣做。要初始化地圖,請使用內(nèi)置的 make 函數(shù):m = make(map[string]int)make 函數(shù)分配并初始化一個哈希映射數(shù)據(jù)結(jié)構(gòu),并返回一個指向它的映射值。我很難理解其中的某些部分:做什么var m map[string]int?為什么我需要寫m = make(map[string]int)但不需要i = make(int)
查看完整描述

3 回答

?
翻閱古今

TA貢獻1780條經(jīng)驗 獲得超5個贊

var m map[string]int 有什么作用?

它告訴編譯器這m是一個類型的變量map[string]int,并將 map[string] int 類型的“零值”分配給m(這就是為什么 m 為 nil,因為 nil 是任何映射的零值)。

為什么我需要寫 m = make(map[string]int) 而不是 i = make(int)

你不需要。您也可以像這樣創(chuàng)建一個初始化的地圖:

m = map[string]int{}

這完全一樣。

map 和 int 之間的區(qū)別是: nil map 非常好。例如len(),一個 nil 映射有效并且為 0。你不能用一個 nil 映射做的唯一事情是存儲鍵值對。如果你想這樣做,你必須準備/初始化地圖。Go 中的這種準備/初始化是通過內(nèi)置函數(shù)make(或如上所示的文字映射)完成的。整數(shù)不需要此初始化過程。由于沒有零整數(shù),因此此初始化將是總噪聲。

請注意,您沒有初始化變量 m:變量m是字符串到整數(shù)的映射,無論是否初始化。Likei是整數(shù)的變量。現(xiàn)在 int 可以直接使用,而 map 需要多一步,因為語言就是這樣工作的。


查看完整回答
反對 回復 2022-01-17
?
狐的傳說

TA貢獻1804條經(jīng)驗 獲得超3個贊

var m map[string]int 有什么作用?


您可以將其視為具有 nil 值的指針,它尚未指向任何內(nèi)容,但能夠指向具體值。


為什么我需要寫 m = make(map[string]int) 而不是 i = make(int)


https://golang.org/doc/effective_go.html#allocation_make


回到分配。內(nèi)置函數(shù) make(T, args) 的用途與 new(T) 不同。它只創(chuàng)建切片、映射和通道,并返回 T 類型(不是 *T)的初始化(非歸零)值。區(qū)別的原因是這三種類型在幕后代表了對必須在使用前初始化的數(shù)據(jù)結(jié)構(gòu)的引用。例如,切片是一個包含指向數(shù)據(jù)(在數(shù)組內(nèi)部)、長度和容量的指針的三項描述符,在這些項被初始化之前,切片為 nil。對于切片、映射和通道,make 初始化內(nèi)部數(shù)據(jù)結(jié)構(gòu)并準備值以供使用。例如,


make([]int, 10, 100)

分配一個 100 個整數(shù)的數(shù)組,然后創(chuàng)建一個長度為 10、容量為 100 的切片結(jié)構(gòu),指向數(shù)組的前 10 個元素。(創(chuàng)建切片時,可以省略容量;有關(guān)更多信息,請參閱切片部分。)相反,new([]int) 返回一個指向新分配的零切片結(jié)構(gòu)的指針,即指向零切片值。


這些示例說明了 new 和 make 之間的區(qū)別。


var p *[]int = new([]int)       // allocates slice structure; *p == nil; rarely useful

var v  []int = make([]int, 100) // the slice v now refers to a new array of 100 ints


// Unnecessarily complex:

var p *[]int = new([]int)

*p = make([]int, 100, 100)


// Idiomatic:

v := make([]int, 100)

請記住,make 僅適用于映射、切片和通道,并且不返回指針。要獲得顯式指針,請使用 new 分配或顯式獲取變量的地址。


查看完整回答
反對 回復 2022-01-17
?
ABOUTYOU

TA貢獻1812條經(jīng)驗 獲得超5個贊

所有字都具有相同的長度,即32 位(4 字節(jié))64 位(8 字節(jié)),具體取決于處理器和操作系統(tǒng)。它們由它們的內(nèi)存地址標識(表示為十六進制數(shù))。

所有原始類型的變量,如intfloat、boolstring ... 都是value types,它們直接指向內(nèi)存中包含的值。像數(shù)組和結(jié)構(gòu)這樣的復合類型也是值類型。當將=值類型的值分配給另一個變量時:j = i,原始值的副本i會在內(nèi)存中生成。

通常需要幾個詞的更復雜的數(shù)據(jù)被視為引用類型。引用類型變量r1包含存儲值的內(nèi)存位置的地址(一個數(shù)字)r1(或至少它的第一個字):

http://img1.sycdn.imooc.com//61e4d3e70001f61d03920074.jpg

對于分配時r2 = r1的引用類型,僅復制引用(地址)而不復制值?。?。如果 r1 的值被修改,該值的所有引用(如 r1 和 r2)都將被反映。

在 Go 中,指針是引用類型,以及切片、映射和通道。引用的變量存儲在堆中,這是垃圾收集的。

鑒于上述陳述,文章為何指出:

要初始化地圖,請使用內(nèi)置的 make 函數(shù)。

make 函數(shù)分配并初始化一個哈希映射數(shù)據(jù)結(jié)構(gòu),并返回一個指向它的映射值。這意味著你可以寫入它,比較

var m map[string]int

這是可讀的,產(chǎn)生一個nil映射,但嘗試寫入一個 nil 映射將導致運行時恐慌。這就是為什么用 初始化地圖很重要的原因make。

m = make(map[string]int)


查看完整回答
反對 回復 2022-01-17
  • 3 回答
  • 0 關(guān)注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號