2 回答

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個贊
struct{}
需要0字節(jié)來存儲。如果您聲明一個帶有值的映射struct{}
,則您只會存儲映射鍵。
如果您想像集合一樣使用映射,那么為其聲明一個單獨(dú)的類型可能會有所幫助:
type?IntSet?map[int]struct{}
并且您可以向其中添加一些方便的方法,例如:
func?(i?IntSet)?Has(v?int)?bool?{ ??_,?ok?:=?i[v]??return?ok }

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個贊
要直接回答您的問題:請參閱下文!
這種“空struct{}
作為映射值技巧”經(jīng)常出現(xiàn),支持的論點(diǎn)總是采用“因此值不需要存儲空間”的形式。
另一件自然要做的事情是使用map[int]bool
.
如果內(nèi)存確實(shí)是您的應(yīng)用程序的限制(例如,因?yàn)槟谟成渲写鎯α藬?shù)百萬或數(shù)十億個鍵),那么可以:使用struct{}
。對于所有其他正常情況:使用struct{}
會使此類映射文字變得尷尬并且鍵查找更加復(fù)雜,因?yàn)槟?em>必須使用逗號 ok 變體(if _,ok := m[k]; ok {
.
對于 bool 值,您可以做一個簡單的操作m[k]
,這樣可以減少輸入并且更容易理解。
我個人認(rèn)為使用struct{}
as 地圖值是一種不必要的、不成熟的、過于聰明的優(yōu)化。如果您確實(shí)需要保存這幾個字節(jié),因?yàn)槟挠成鋵瑪?shù)百萬個條目,那么映射可能不是正確的數(shù)據(jù)結(jié)構(gòu):根據(jù)用例位向量、稀疏數(shù)據(jù)結(jié)構(gòu)甚至概率數(shù)據(jù)結(jié)構(gòu)(bloom-、cuckoo) -filters)、union-find 等可能更適合。
答案:不可以。在地圖文字中,您必須指定每個鍵。(一般經(jīng)驗(yàn)法則:Go 中沒有語法糖;Go 中沒有聰明的捷徑;Go 中的一切都是明確的。)
- 2 回答
- 0 關(guān)注
- 143 瀏覽
添加回答
舉報