结构体是否可以比较

structure-comparison

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

上面的 sn1sn3 就是不同的结构体,所以不能进行比较。sn1sn2 可以比较。

结论二:结构体是相同的,但是结构体属性中有不可以比较的类型,如 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")
}

以上就是结构体是否可以比较的相关说明,祝您阅读愉快~

comments powered by Disqus