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 需要多一步,因為語言就是這樣工作的。

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 分配或顯式獲取變量的地址。

TA貢獻1812條經(jīng)驗 獲得超5個贊
所有字都具有相同的長度,即32 位(4 字節(jié))或64 位(8 字節(jié)),具體取決于處理器和操作系統(tǒng)。它們由它們的內(nèi)存地址標識(表示為十六進制數(shù))。
所有原始類型的變量,如int、float、bool、string ... 都是value types
,它們直接指向內(nèi)存中包含的值。像數(shù)組和結(jié)構(gòu)這樣的復合類型也是值類型。當將=
值類型的值分配給另一個變量時:j = i
,原始值的副本i
會在內(nèi)存中生成。
通常需要幾個詞的更復雜的數(shù)據(jù)被視為引用類型。引用類型變量r1
包含存儲值的內(nèi)存位置的地址(一個數(shù)字)r1
(或至少它的第一個字):
對于分配時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)
- 3 回答
- 0 關(guān)注
- 195 瀏覽
添加回答
舉報