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

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

Go中的地圖初始化

Go中的地圖初始化

Go
catspeake 2023-06-01 14:21:21
據(jù)我了解,Go 中的類型slice和map在很多方面都很相似。他們都是reference(或container)類型。在抽象數(shù)據(jù)類型方面,它們分別表示數(shù)組和關(guān)聯(lián)數(shù)組。然而,他們的行為卻截然不同。var?s?[]int var?m?map[int]int雖然我們可以立即使用聲明的切片(附加新項或重新切片),但我們不能對新聲明的映射做任何事情。我們必須顯make式調(diào)用函數(shù)并初始化地圖。因此,如果某個結(jié)構(gòu)包含一個映射,我們必須為該結(jié)構(gòu)編寫一個構(gòu)造函數(shù)。所以,問題是為什么不能在聲明映射時添加一些語法糖并同時分配和初始化內(nèi)存。我確實用谷歌搜索了這個問題,學(xué)到了一個新詞“avtovivification”,但仍然看不出原因。我不是在談?wù)摻Y(jié)構(gòu)文字。是的,您可以通過提供諸如m := map[int]int{1: 1}.?但是,如果您有一些結(jié)構(gòu):package mainimport (? ? "fmt")type SomeStruct struct {? ? someField map[int]int? ? someField2 []int}func main() {? ? s := SomeStruct{}? ? s.someField2 = append(s.someField2, -1) // OK? ? s.someField[0] = -1 // panic: assignment to entry in nil map? ? fmt.Println(s)}不可能立即使用結(jié)構(gòu)(所有字段都使用默認(rèn)值)。必須創(chuàng)建一個構(gòu)造函數(shù),該函數(shù)SomeStruct必須顯式初始化映射。
查看完整描述

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)值無法猜測您需要的容量。


查看完整回答
反對 回復(fù) 2023-06-01
?
海綿寶寶撒

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只是聲明。


查看完整回答
反對 回復(fù) 2023-06-01
  • 2 回答
  • 0 關(guān)注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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