相同結(jié)構(gòu)體,相同的值內(nèi)容 可以比較
type Value struct {
Name string
Gender string
}
func main() {
v1 := Value{Name: "煎魚", Gender: "男"}
v2 := Value{Name: "煎魚", Gender: "男"}
if v1 == v2 {
fmt.Println("腦子進(jìn)煎魚了")
return
}
fmt.Println("腦子沒進(jìn)煎魚")
}
輸出結(jié)果:
腦子進(jìn)煎魚了
指針引用亥曹,其雖然都是 new(string)邓了,從表象來看是一個(gè)東西,但其具體返回的地址是不一樣的媳瞪。
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("腦子進(jìn)煎魚了")
return
}
fmt.Println("腦子沒進(jìn)煎魚")
}
答案是:腦子沒進(jìn)煎魚骗炉。
若要比較,則需改為:
func main() {
gender := new(string)
v1 := Value{Name: "煎魚", Gender: gender}
v2 := Value{Name: "煎魚", Gender: gender}
...
}
不同結(jié)構(gòu)體蛇受,相同的值內(nèi)容 不能比較句葵。(借助強(qiáng)制轉(zhuǎn)換來實(shí)現(xiàn))
- 一定要用結(jié)構(gòu)體比較怎么辦?我們可以借助
強(qiáng)制轉(zhuǎn)換
來實(shí)現(xiàn)
type Value1 struct {
Name string
}
type Value2 struct {
Name string
}
func main() {
v1 := Value1{Name: "煎魚"}
v2 := Value2{Name: "煎魚"}
if v1 == v2 {
fmt.Println("腦子進(jìn)煎魚了")
return
}
fmt.Println("腦子沒進(jìn)煎魚")
}
顯然兢仰,會(huì)直接報(bào)錯(cuò):
./main.go:18:8: invalid operation: v1 == v2 (mismatched types Value1 and Value2)
那是不是就完全沒法比較了呢乍丈?并不,我們可以借助強(qiáng)制轉(zhuǎn)換來實(shí)現(xiàn):
if v1 == Value1(v2) {
fmt.Println("腦子進(jìn)煎魚了")
return
}
這樣程序就會(huì)正常運(yùn)行把将,且輸出 “腦子進(jìn)煎魚了”轻专。當(dāng)然,若是不可比較類型察蹲,依然是不行的请垛。
Go 結(jié)構(gòu)體包含:slice、map洽议、function 時(shí)宗收,不能比較。
- 如果我們被迫無奈亚兄,被要求一定要用結(jié)構(gòu)體比較怎么辦混稽?這時(shí)候可以使用反射方法
reflect.DeepEqual
.
func main() {
v1 := Value{Name: "煎魚", GoodAt: []string{"炸", "煎", "蒸"}}
v2 := Value{Name: "煎魚", GoodAt: []string{"炸", "煎", "蒸"}}
if reflect.DeepEqual(v1, v2) {
fmt.Println("腦子進(jìn)煎魚了")
return
}
fmt.Println("腦子沒進(jìn)煎魚")
}
https://mp.weixin.qq.com/s/HScH6nm3xf4POXVk774jUA