2 回答

TA貢獻(xiàn)1811條經(jīng)驗 獲得超6個贊
雖然我們可以立即使用聲明的切片(附加新項或重新切片),但我們不能對新聲明的映射做任何事情。我們必須顯
make
式調(diào)用函數(shù)并初始化地圖。因此,如果某個結(jié)構(gòu)包含一個映射,我們必須為該結(jié)構(gòu)編寫一個構(gòu)造函數(shù)。
這不是真的。切片和映射的默認(rèn)值(或更準(zhǔn)確地說是零值nil
)是.?nil
您可以對地圖執(zhí)行與對切片執(zhí)行的“相同”操作nil
。你可以檢查nil
地圖的長度,你可以索引nil
地圖(結(jié)果將是地圖值類型的零值),例如以下所有工作:
var m map[int]int
fmt.Println(m == nil) // Prints true
fmt.Println(len(m))? ?// Prints 0
fmt.Println(m[2])? ? ?// Prints 0
在Go Playground上嘗試一下。
您對零值切片的更多“感覺”是您可以為其添加值。這是事實,但在幕后,將使用make()
您必須為地圖調(diào)用的確切內(nèi)置函數(shù)來分配一個新切片,以便向其添加條目,并且您必須(重新)分配返回的切片。因此,零值切片與零值映射“無法使用”。append()
只負(fù)責(zé)必要的(重新)分配和復(fù)制。我們可以有一個“等效”addEntry()
函數(shù),您可以將映射值和鍵值對傳遞給它,如果傳遞的映射是nil
,它可以分配一個新的映射值并返回它。如果不調(diào)用append()
,就不能向nil
切片添加值,就像不能向nil
映射添加條目一樣。
nil
切片和映射的零值(而不是初始化的切片或映射)的主要原因是性能和效率。通常,映射或切片值(變量或結(jié)構(gòu)字段)永遠(yuǎn)不會被使用,或者不會立即使用,因此如果它們在聲明時分配,那將是內(nèi)存(和一些 CPU)的浪費資源,更不用說它為垃圾收集器提供了更多工作。此外,如果零值是一個初始化值,它通常是不夠的(例如,一個 0 大小的切片不能容納任何元素),并且當(dāng)您向它添加新元素時它通常會被丟棄(因此初始分配將是完全浪費)。
是的,有些情況下您確實想立即使用切片和映射,在這種情況下您可以調(diào)用make()
自己,或使用復(fù)合文字。您還可以使用特殊形式make()
為地圖提供(初始)容量,避免未來地圖內(nèi)部結(jié)構(gòu)的重組(這通常需要不可忽略的計算)。自動非nil
默認(rèn)值無法猜測您需要的容量。

TA貢獻(xiàn)1809條經(jīng)驗 獲得超8個贊
你可以!您正在尋找的是:
package main
import "fmt"
func main() {
v := map[int]int{}
v[1] = 1
v[2] = 2
fmt.Println(v)
}
:=是聲明和分配,其中 asvar只是聲明。
- 2 回答
- 0 關(guān)注
- 148 瀏覽
添加回答
舉報