空结构体数组比较:了解变量行为
在 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中文网其他相关文章!