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:使用type
bool
而不是type
map
。在空结构上签出这篇文章:那
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
}