在golang中使用空接口或空结构作为映射值的任何区别

can*_*dry 26 go

我正在使用此构造来模拟一组

type MyType uint8
map[MyType]interface{}
Run Code Online (Sandbox Code Playgroud)

然后我添加所有键并将它们映射到nil.

我了解到它也可以使用

map[MyType]struct{}
Run Code Online (Sandbox Code Playgroud)

使用空结构的任何好处interface{}.

pet*_*rSO 31

内存使用情况.例如,类型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))
}
Run Code Online (Sandbox Code Playgroud)

输出(32位架构的字节数):

0
8
1
Run Code Online (Sandbox Code Playgroud)

输出(64位架构的字节数):

0
16
1
Run Code Online (Sandbox Code Playgroud)

参考文献:

转到数据结构:接口

  • @DanielWilliams:使用类型`bool`而不是类型`map`. (3认同)

and*_*olm 21

空结构和空接口虽然在语法上相似,但实际上是对立的.空结构不包含任何数据; 空接口可以包含任何类型的值.如果我看到了map[MyType]struct{},我立即知道没有值存储,只有密钥.如果我看到了map[MyType]interface{},我的第一印象就是它是一个异质的价值观集合.即使我看到代码存储在其中的nil,我也不确定其他一些代码不会在其中存储其他内容.

换句话说,使用struct{}使您的代码更具可读性.它还节省了一点内存,如另一个答案中所述,但这只是使用正确工具的一项附带好处.