结构体比较

题目

下面代码是否可以编译通过?为什么?

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"}

sn3sn1就不是相同的结构体了,不能比较。

结构体比较规则注意2:结构体是相同的,但是结构体属性中有不可以比较的类型,如map,slice,则结构体不能用==比较。

可以使用reflect.DeepEqual进行比较

1
2
3
4
5
if reflect.DeepEqual(sm1, sm2) {
fmt.Println("sm1 == sm2")
} else {
fmt.Println("sm1 != sm2")
}

文章出处


结构体比较
http://example.com/2023/05/16/Go每日一题/结构体比较/
作者
Feng Tao
发布于
2023年5月16日
更新于
2023年5月16日
许可协议