首页 >后端开发 >Golang >为什么指针数组与空结构的比较会产生不一致的结果?

为什么指针数组与空结构的比较会产生不一致的结果?

Susan Sarandon
Susan Sarandon原创
2024-12-28 20:59:16742浏览

Why Do Comparisons of Arrays of Pointers to Empty Structs Produce Inconsistent Results?

为什么数组与空结构的比较会产生不同的结果

给定一个指向空结构的指针数组,为什么数组的相等比较会产生不同的结果有时评估为 true,有时评估为 true false?

行为探索

package main

import "fmt"

type myStruct struct{}

func main() {
    s, ss := myStruct{}, myStruct{}
    arr1 := [6]*myStruct{&s}
    arr2 := [6]*myStruct{&ss}
    fmt.Println(&s == &ss, arr1 == arr2)  // Produces mixed results (e.g., false, true or true, false)

    l, ll := myStruct{A: 1}, myStruct{A: 1}
    arr3 := [6]*myStruct{&l}
    arr4 := [6]*myStruct{&ll}
    fmt.Println(&l == &ll, arr3 == arr4)  // Always evaluates to false
}

解释

Go 语言规范指出:

  • 指向不同零大小变量的指针可能是也可能不是等于。
  • 如果结构体或数组不包含非零大小的字段(或元素),则其大小为零。
  • 两个不同的零大小变量在内存中可能具有相同的地址。

动态行为和逃逸分析

行为可以解释考虑Go编译器执行的转义分析。

  • 在第一个示例中,变量 s 和 ss 没有转义(即,它们不是通过引用传递给其他函数的)。这意味着编译器在内存中分配它们时具有更大的灵活性,并且可以为它们分配相同的地址。
  • 在第二个示例中,添加 fmt.Printf 调用(同时转义 s 和 ss)会导致编译器移动变量到堆,导致不同的内存地址,从而产生 false for &l == &ll.

含义

  • 根据指针的相等性来比较空结构数组的相等性是不可靠的。
  • 逃逸分析可以显着影响此类比较的行为。

以上是为什么指针数组与空结构的比较会产生不一致的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

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