Go 结构体是否可以比较,为什么?

相同结构体,相同的值内容 可以比较

type Value struct {
    Name   string
    Gender string
}

func main() {
    v1 := Value{Name: "煎鱼", Gender: "男"}
    v2 := Value{Name: "煎鱼", Gender: "男"}
    if v1 == v2 {
        fmt.Println("脑子进煎鱼了")
        return
    }

    fmt.Println("脑子没进煎鱼")
}
输出结果:
脑子进煎鱼了

指针引用,其虽然都是 new(string),从表象来看是一个东西,但其具体返回的地址是不一样的。

type Value struct {
    Name   string
    Gender *string
}

func main() {
    v1 := Value{Name: "煎鱼", Gender: new(string)}
    v2 := Value{Name: "煎鱼", Gender: new(string)}
    if v1 == v2 {
        fmt.Println("脑子进煎鱼了")
        return
    }

    fmt.Println("脑子没进煎鱼")
}
答案是:脑子没进煎鱼。

若要比较,则需改为:
func main() {
    gender := new(string)
    v1 := Value{Name: "煎鱼", Gender: gender}
    v2 := Value{Name: "煎鱼", Gender: gender}
    ...
}

不同结构体,相同的值内容 不能比较。(借助强制转换来实现)

  • 一定要用结构体比较怎么办?我们可以借助强制转换来实现
type Value1 struct {
    Name string
}

type Value2 struct {
    Name string
}

func main() {
    v1 := Value1{Name: "煎鱼"}
    v2 := Value2{Name: "煎鱼"}
    if v1 == v2 {
        fmt.Println("脑子进煎鱼了")
        return
    }
    fmt.Println("脑子没进煎鱼")
}
显然,会直接报错:
./main.go:18:8: invalid operation: v1 == v2 (mismatched types Value1 and Value2)

那是不是就完全没法比较了呢?并不,我们可以借助强制转换来实现:
 if v1 == Value1(v2) {
  fmt.Println("脑子进煎鱼了")
  return
 }
 这样程序就会正常运行,且输出 “脑子进煎鱼了”。当然,若是不可比较类型,依然是不行的。

Go 结构体包含:slice、map、function 时,不能比较。

  • 如果我们被迫无奈,被要求一定要用结构体比较怎么办?这时候可以使用反射方法 reflect.DeepEqual.
func main() {
    v1 := Value{Name: "煎鱼", GoodAt: []string{"炸", "煎", "蒸"}}
    v2 := Value{Name: "煎鱼", GoodAt: []string{"炸", "煎", "蒸"}}
    if reflect.DeepEqual(v1, v2) {
        fmt.Println("脑子进煎鱼了")
        return
    }

    fmt.Println("脑子没进煎鱼")
}

https://mp.weixin.qq.com/s/HScH6nm3xf4POXVk774jUA

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容