结构体比较

题目:

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

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

答案解析

​ 编译不通过。

​ 关于 Go 语言中的 struct 比较问题,这个需要分情况来讨论:

  • 对于不同类型的 struct 无法进行比较

  • 同一个 struct 的两个实例可比较也不可比较,

    • 如果该 strcut 的所有字段都是可比较类型,则可以比较

    • 如果包含不可比较字段,如 slice、map、func 时,不可比较,但可以通过如下方式进行比较

      1
      2
      3
      4
      5
      6
      7
      可以使用reflect.DeepEqual进行比较

      if reflect.DeepEqual(sm1, sm2) {
      fmt.Println("sm1 == sm2")
      } else {
      fmt.Println("sm1 != sm2")
      }

结构体比较
http://example.com/2023/09/04/Go每日一题/结构体比较细节/
作者
Feng Tao
发布于
2023年9月4日
更新于
2023年9月4日
许可协议