Dictionary 你能有一张围棋没有价值的地图吗?
我问,因为我喜欢地图不允许多个键。我知道你可以像下面这样做,其中你的值是bools或empty struct,但是有没有办法绕过为你的键指定任何值呢?必须指定空结构有什么好处吗 相关,但只注重附加唯一的值Dictionary 你能有一张围棋没有价值的地图吗?,dictionary,go,unique,Dictionary,Go,Unique,我问,因为我喜欢地图不允许多个键。我知道你可以像下面这样做,其中你的值是bools或empty struct,但是有没有办法绕过为你的键指定任何值呢?必须指定空结构有什么好处吗 相关,但只注重附加唯一的值 type N struct {} func tengoQueCagar() { var map_almost_empty_value1 = map[int]bool{0:true,1:false} var map_almost_empty_value2 = map[int]s
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...
}
struct{}
需要存储0字节。如果您使用struct{}
值声明一个映射,那么您只能存储映射键
有一篇很好的关于它的博文:
如果要像使用集合一样使用映射,为其声明单独的类型可能会有所帮助:
type IntSet map[int]struct{}
您可以添加一些方便的方法,例如:
func(i IntSet)有(v int)bool{
_,ok:=i[v]
返回ok
}
要直接回答您的问题,请参见下文
这种“空struct{}
as-map-values技巧”经常出现,并且赞成的参数总是以“因此值不需要存储空间”的形式出现
另一个自然的做法是使用map[int]bool
如果内存确实是应用程序的一个限制(例如,因为您在地图中存储了数百万或数十亿个密钥),那么是:使用struct{}
。对于所有其他正常情况:使用struct{}
会使这种映射文字变得笨拙,键查找也变得更加复杂,因为您必须使用逗号ok变量(if u,ok:=m[k];ok{
)
对于布尔值,您可以执行一个简单的m[k]
,它的输入更少,更容易理解
我个人认为使用struct{}
as map value是一个不必要的、过早的、过于聪明的优化。如果您真的需要保存这几个字节,因为您的map将包含数百万个条目,那么map可能无论如何都不是正确的数据结构:取决于用例位向量、稀疏数据结构甚至概率数据结构(布卢姆、布谷鸟过滤器)、联合发现等可能更适合
答案:不。在映射文字中,你必须指定每个键。(一般经验法则:Go中没有语法糖分;Go中没有聪明的快捷方式;Go中的一切都是显式的。)没有值的映射不是映射——它是一个列表。如果你发现自己在做
结构{}{}
很多时候,你可以为它创建一个快捷变量。empty:=struct{}{};map[int]struct{}{0:empty,1:empty}
@Flimzy这是真的吗?映射保证唯一的键……这一定会涉及一些开销。当然,根据定义,这是真的。映射是一个事物到另一个事物的关联。没有“另一个”,它不是地图。是的,它只是在我的鼻子里闻起来。谢谢你的评论!对集合使用map[K]bool
的一个缺点是未使用false
值存储在地图中。我见过这样的地图被用作集合,有人在其中添加/编辑代码m[someKey]=false
而不是delete(m,someKey)
if m[someKey]作为集合成员测试,哪个当然会破坏任何代码。@DaveC“如果m[someKey]作为集合成员测试,哪个当然会破坏任何代码。”为什么?在这种情况下,m[someKey]==false。哦,我倒过来了,if m[someKey]
测试继续工作,但做if,ok:=m[someKey];好的
说它存在,但有人做了一个m[someKey]=false
可能是想让钥匙不存在。同样在丹佛?我很确定戴夫·切尼住在下面。