亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

你能有一張沒有go價值的地圖嗎?

你能有一張沒有go價值的地圖嗎?

Go
守著一只汪 2023-07-17 14:19:09
我問是因為我喜歡地圖不允許多個鍵。我知道您可以執行如下操作,其中您的值是布爾值或空結構,但是有沒有辦法繞過為您的鍵指定任何值?必須指定空結構有什么好處嗎?相關問題,但重點關注僅附加唯一值。type N struct {}func tengoQueCagar() {? ? var map_almost_empty_value1 = map[int]bool{0:true,1:false}? ? var map_almost_empty_value2 = map[int]struct{}{0:struct{}{},1:struct{}{}} //long and seems like lame syntax...? ? var map_almost_empty_value3 = map[int]N{0:N{},1:N{}} //shorter.. better?? ? var map_not_possible_empty_value_2 = map[int]nil{0:nil,1:nil} // better than empty struct syntax... but not possible? ? var map_not_possible_empty_value_2 = map[int]{0,1} // ideally possible... but not...?? ? //do something...}
查看完整描述

2 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

struct{}需要0字節來存儲。如果您聲明一個帶有值的映射struct{},則您只會存儲映射鍵。

如果您想像集合一樣使用映射,那么為其聲明一個單獨的類型可能會有所幫助:

type?IntSet?map[int]struct{}

并且您可以向其中添加一些方便的方法,例如:

func?(i?IntSet)?Has(v?int)?bool?{
??_,?ok?:=?i[v]??return?ok
}


查看完整回答
反對 回復 2023-07-17
?
慕后森

TA貢獻1802條經驗 獲得超5個贊

要直接回答您的問題:請參閱下文!

這種“空struct{}作為映射值技巧”經常出現,支持的論點總是采用“因此值不需要存儲空間”的形式。

另一件自然要做的事情是使用map[int]bool.

如果內存確實是您的應用程序的限制(例如,因為您在映射中存儲了數百萬或數十億個鍵),那么可以:使用struct{}。對于所有其他正常情況:使用struct{}會使此類映射文字變得尷尬并且鍵查找更加復雜,因為您必須使用逗號 ok 變體(if _,ok := m[k]; ok {.

對于 bool 值,您可以做一個簡單的操作m[k],這樣可以減少輸入并且更容易理解。

我個人認為使用struct{}as 地圖值是一種不必要的、不成熟的、過于聰明的優化。如果您確實需要保存這幾個字節,因為您的映射將包含數百萬個條目,那么映射可能不是正確的數據結構:根據用例位向量、稀疏數據結構甚至概率數據結構(bloom-、cuckoo) -filters)、union-find 等可能更適合。

答案:不可以。在地圖文字中,您必須指定每個鍵。(一般經驗法則:Go 中沒有語法糖;Go 中沒有聰明的捷徑;Go 中的一切都是明確的。)


查看完整回答
反對 回復 2023-07-17
  • 2 回答
  • 0 關注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號