首页 >后端开发 >Golang >为什么 Go 中的空结构体数组有时比较相等,尽管它们的指针不同?

为什么 Go 中的空结构体数组有时比较相等,尽管它们的指针不同?

Susan Sarandon
Susan Sarandon原创
2024-12-24 01:50:19315浏览

Why Do Arrays of Empty Structs in Go Sometimes Compare as Equal Despite Their Pointers Being Different?

空结构体数组比较:了解变量行为

在 Go 中比较空结构体数组时,您可能会遇到意想不到的结果。让我们通过代码示例来探索这种行为并理解它发生的原因。

考虑以下代码:

var s, ss struct{} // two empty structs
arr1 := [6]*struct{}{&s} // array with empty struct pointer
arr2 := [6]*struct{}{&ss} // array with empty struct pointer
fmt.Println(&s == &ss, arr1 == arr2)  // false, true

这里,我们定义空结构体 s 和 ss,初始化数组 arr1 和 arr2指向这些结构的指针,并打印比较结果。令人惊讶的是,虽然 &s 和 &ss 不相等,但 arr1 和 arr2 相等。

要理解这一点,我们需要参考 Go 规范。指针值的规范规定,如果它们指向同一个变量或者两者的值为 nil,则它们相等。至关重要的是,它指出指向不同的零大小变量的指针“可能相等,也可能不相等。”

此外,没有字段的结构的大小为零。因此, &s 和 &ss 指向不同的零大小变量,并且比较 &s == &ss 的计算结果可能为 true 或 false。

同样,数组比较 arr1 == arr2 的行为也无法保证。零大小变量的规范表明它们“可能”在内存中具有相同的地址。因此,arr1 和 arr2 可能相等也可能不相等,并且结果可能因程序的不同运行而异。

总而言之,比较不同零大小变量(例如空结构)的指针可能会产生不可预测的结果结果。虽然您可能会观察到一次特定结果,但由于编译器优化内存分配的方式,它在后续运行中可能会有所不同。

以上是为什么 Go 中的空结构体数组有时比较相等,尽管它们的指针不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn