在golang中映射[T] struct {}和map [T] bool

时间:2016-05-19 10:17:47

标签: go

区别是什么? map[T]bool优化为map[T]struct{}吗? Go中最好的做法是什么?

使用map[T]struct{}的最佳理由可能是您不必回答问题&#34;如果值为false&#34;这是什么意思?< / p>

3 个答案:

答案 0 :(得分:6)

来自“The Go Programming Language”:

  

没有字段的结构类型称为空结构,写入   struct{}。它的大小为零,不提供任何信息,但可能是   虽然有用。一些Go程序员使用它代替bool作为   表示集合的地图的值类型,以强调只有   键是重要的,但节省空间是边缘和语法   更麻烦,所以我们通常会避免它。

如果您使用bool测试“套装”中的状态稍微好一点,因为您可以说:

if mySet["something"] {
    /* .. */
}

答案 1 :(得分:1)

区别在于内存要求。在bonnet下,空结构不是指针,而是保存内存的特殊值。

答案 2 :(得分:0)

空结构是一种类似于任何其他类型的结构类型。您习惯使用普通结构的所有属性同样适用于空结构。您可以声明structs{}的数组,但它们当然不会占用存储空间。

var x [100]struct{}
fmt.Println(unsafe.Sizeof(x)) // prints 0

如果空结构不包含任何数据,则无法确定两个struct{}值是否不同。

考虑到上述陈述,这意味着我们可以将它们用作方法接收者。

type S struct{}

func (s *S) addr() { fmt.Printf("%p\n", s) }

func main() {
        var a, b S
        a.addr() // 0x1beeb0
        b.addr() // 0x1beeb0
}