2 回答

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

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 中的一切都是明確的。)
- 2 回答
- 0 關注
- 152 瀏覽
添加回答
舉報