题目
下面代码是否可以编译通过?为什么?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| package main
import "fmt"
func main() {
sn1 := struct { age int name string }{age: 11, name: "qq"}
sn2 := struct { age int name string }{age: 11, name: "qq"}
if sn1 == sn2 { fmt.Println("sn1 == sn2") }
sm1 := struct { age int m map[string]string }{age: 11, m: map[string]string{"a": "1"}}
sm2 := struct { age int m map[string]string }{age: 11, m: map[string]string{"a": "1"}}
if sm1 == sm2 { fmt.Println("sm1 == sm2") } }
|
查看答案
答案解析:
编译不通过,因为map属于不可比较类型。
./prog.go:31:9: invalid operation: sm1 == sm2 (struct containing map[string]string cannot be compared)
考点:结构体比较
结构体比较规则注意1:只有相同类型的结构体才可以比较,结构体是否相同不但与属性类型个数有关,还与属性顺序相关。
比如:
1 2 3 4 5 6 7 8 9
| sn1 := struct { age int name string }{age: 11, name: "qq"}
sn3:= struct { name string age int }{age:11, name:"qq"}
|
sn3
与sn1
就不是相同的结构体了,不能比较。
结构体比较规则注意2:结构体是相同的,但是结构体属性中有不可以比较的类型,如map
,slice
,则结构体不能用==
比较。
可以使用reflect.DeepEqual进行比较
1 2 3 4 5
| if reflect.DeepEqual(sm1, sm2) { fmt.Println("sm1 == sm2") } else { fmt.Println("sm1 != sm2") }
|
文章出处