区别是什么? map[T]bool
优化为map[T]struct{}
吗? Go中最好的做法是什么?
使用map[T]struct{}
的最佳理由可能是您不必回答问题"如果值为false
&#34;这是什么意思?< / p>
答案 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
}