在 Go 中,映射用于存储键值对。映射的值类型可以是任何类型,包括接口或结构。虽然空接口和空结构都可以用来表示映射中没有值,但两者之间存在一些关键区别。
内存使用
无论架构如何,空结构的固定大小均为 0 字节。另一方面,空接口的大小在 32 位体系结构上为 8 字节,在 64 位体系结构上为 16 字节。这是因为空接口存储指向实际值的指针,即使该值为零。
问题中提供的示例代码演示了这种差异:
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 位架构的字节):
0 8 1
输出(字节对于 64 位架构):
0 16 1
如您所见,空结构体的内存开销为 0 字节,而空接口的内存开销为 8 字节(32 位)或 16 字节(64 位)。
性能
就性能而言,使用空结构通常比使用空接口更有效。这是因为编译器可以更有效地优化涉及空结构的操作。
结论
根据映射的值类型在空接口和空结构之间进行选择根据申请的具体要求。如果内存使用是一个问题,空结构是更好的选择。出于性能原因,空结构也是首选。但是,如果地图打算与各种值类型一起使用,则空接口可能更合适。
以上是空结构体或空接口:Go 中哪个映射值更好?的详细内容。更多信息请关注PHP中文网其他相关文章!