Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 你能有一张围棋没有价值的地图吗?_Dictionary_Go_Unique - Fatal编程技术网

Dictionary 你能有一张围棋没有价值的地图吗?

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

我问,因为我喜欢地图不允许多个键。我知道你可以像下面这样做,其中你的值是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]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
可能是想让钥匙不存在。同样在丹佛?我很确定戴夫·切尼住在下面。