为什么只使用新函数创建的相同结构的两个指针在go中比较相等

时间:2014-10-15 09:27:12

标签: go

我想比较同一结构的2个实例,看它是否相等,并得到两个不同的结果。

  1. 注释代码// fmt.Println("%#v \ n",a),程序输出为" Equal"
  2. 使用fmt打印变量" a"然后我得到输出" Not Equal"
  3. 请帮我找出为什么???

    我使用golang 1.2.1

    package main
    
    import (
        "fmt"
    )
    
    type example struct {
    }
    
    func init() {
       _ = fmt.Printf
    }
    
    func main() {
    
        a := new(example)
        b := new(example)
    
        // fmt.Println("%#v\n", a)
        if a == b { 
            println("Equals")
        } else {
            println("Not Equals")
        }   
    }
    

1 个答案:

答案 0 :(得分:6)

这里涉及以下几个方面:

  1. 您通常无法通过比较指针来比较结构的值:ab是指向example的指针而不是示例的实例。 a==b比较指针(即内存地址)而不是值。

  2. 不幸的是,你的example是空结构struct{},并且对于唯一的空结构而言,它实际上并不存在,因为它不占用任何空间,因此不同的struct {}可能(或可能不)具有相同的地址。

  3. 所有这些与调用fmt.Println无关。空结构的特殊行为只是通过fmt.Println完成的反射来表现出来。

    只是不要使用struct {}来测试任何真实结构的行为方式。