Go 使用空接口或空结构作为映射的任何区别';s值多少?
我用这个构造来模拟一个集合Go 使用空接口或空结构作为映射的任何区别';s值多少?,go,Go,我用这个构造来模拟一个集合 type MyType uint8 map[MyType]interface{} 然后我添加所有密钥并将它们映射到nil 我了解到,也可以使用 map[MyType]struct{} 使用空结构与接口{}内存使用相比的任何好处。例如,类型struct{},interface{}和bool package main import ( "fmt" "unsafe" ) func main() { var s struct{} fmt
type MyType uint8
map[MyType]interface{}
然后我添加所有密钥并将它们映射到nil
我了解到,也可以使用
map[MyType]struct{}
使用空结构与
接口{}
内存使用相比的任何好处。例如,类型struct{}
,interface{}
和bool
package main
import (
"fmt"
"unsafe"
)
func main() {
var s struct{}
fmt.Println(unsafe.Sizeof(s))
var i interface{}
fmt.Println(unsafe.Sizeof(i))
var b bool
fmt.Println(unsafe.Sizeof(b))
}
输出(32位体系结构的字节):
输出(64位体系结构的字节):
参考资料:
空结构和空接口虽然在语法上相似,但实际上是相反的。空结构包含无数据;空界面可以容纳任何类型的值。如果我看到一个
映射[MyType]结构{}
,我立即知道不会存储任何值,只存储键。如果我看到一个map[MyType]接口{}
,我的第一印象将是它是一个异构的值集合。即使我看到代码中存储了nil,我也无法确定其他代码中是否存储了其他内容
换句话说,使用
struct{}
使代码更具可读性。正如另一个答案中所述,它还节省了一点内存,但这只是在工作中使用正确工具的一个附带好处。我想补充有关空结构的更多细节,因为andybalholm和peterSO已经涵盖了这些差异
下面是显示空结构可用性的示例
使用指针地址创建矩形结构的实例
运算符由&符号表示
参考:
如需详细阅读,请参阅:这对地图的内存使用有何影响?它将在内部为值的结构{}类型分配什么?@DanielWilliams:Go映射存储键和元素值。
struct{}
元素值占用零字节。我想这会导致map[struct{}]struct{}
发生什么?它将有一个零大小的键和一个零大小的值,但你可以把一件事放在它上面(也是零大小)。@DanielWilliams:使用typebool
而不是typemap
。在空结构上签出这篇文章:那map[MyType]bool
呢?我自己实际上倾向于使用map[MyType]bool
,因为它可以在if
条件下直接使用,并且它可能会生成可读性最高的代码。但是OP只询问了struct
和interface
,我想让我的答案保持简单。(而map[MyType]struct{}
是公认的集合习惯用法。)
0
8
1
0
16
1
package main
import "fmt"
type rectangle struct {
length int
breadth int
color string
}
func main() {
var rect1 = &rectangle{10, 20, "Green"} // Can't skip any value
fmt.Println(rect1)
var rect2 = &rectangle{}
rect2.length = 10
rect2.color = "Red"
fmt.Println(rect2) // breadth skipped
var rect3 = &rectangle{}
(*rect3).breadth = 10
(*rect3).color = "Blue"
fmt.Println(rect3) // length skipped
}