在Golang项目开发中,有时会有比较结构体是否相等的情况,通过Golang的语言特性可以总结为两点结论:只有相同类型的结构体才可以比较,结构体是否相同不但与属性类型个数有关,还与属性顺序相关;结构体是相同的,但是结构体属性中有不可以比较的类型,如 map, slice, channel, function 则结构体不能用 == 比较。下面通过一个示例来看看,结构体哪些可以比较哪些不可以比较。
先来看一段示例代码:
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
|
package main
import "fmt"
func main() {
sn1 := struct {
age int
name string
}{age: 11, name: "tom"}
sn2 := struct {
age int
name string
}{age: 11, name: "tom"}
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")
}
}
|
上面这段代码将会编译不通过,上面我们也给出了结论,下面来说明:
结论一:只有相同类型的结构体才可以比较,结构体是否相同不但与属性类型个数有关,还与属性顺序相关。
1
2
3
4
5
6
7
8
9
|
sn1 := struct {
age int
name string
}{age: 11, name: "tom"}
sn3 := struct {
name string
age int
}{age: 11, name: "tom"}
|
上面的 sn1 与 sn3 就是不同的结构体,所以不能进行比较。sn1 与 sn2 可以比较。
结论二:结构体是相同的,但是结构体属性中有不可以比较的类型,如 map, slice, channel, function 则结构体不能用 == 比较。但是可以使用 reflect.DeepEqual 进行比较。
1
2
3
4
5
|
if reflect.DeepEqual(sm1, sm2) {
fmt.Println("sm1 == sm2")
} else {
fmt.Println("sm1 != sm2")
}
|
以上就是结构体是否可以比较的相关说明,祝您阅读愉快~