直接看例子:

比较 customer 结构体的两个实例

这里定义了一个 customer 结构体,在 main 函数里比较它的两个实例的值,这两个实例的字段的值是相同的。

那么,这个输出结果是 true 还是 false 呢?

答案是:true。

通过这个例子,我们至少可以得出一个结论:可以使用 == 来比较 customer 结构体的两个实例的相等性。


下面我们把代码稍作调整:

customer 结构体定了一个 slice 类型的字段

可能有人认为这个结果也是 true,但其实这段代码都没法通过编译!

错误信息是:

./main.go:13:20: invalid operation: cust1 == cust2 (struct containing []float64 cannot be compared)

为什么会这样?这就需要了解一下 == 和 != 运算符的工作原理了。


在 Go 语言里,可以使用 == 和 != 运算符比较两个可比较类型的相等性。

可比较的类型包括:

  • 布尔类型;

  • 数值类型:两个值具有相同的数值类型或者可以转化为相同的类型;

  • 字符串;

  • 指针:比较两个指针是否指向内存中的同一个值,或者都为 nil;

  • Channel:比较两个 channel 是否来自同一个 make 的调用,或者都为 nil。

此外,如果 struct 和数组是由这些可比较类型组成的,那么它们也可以进行比较相等性。

但是,map 和 slice 无法通过 == 和 != 比较相等性。


所以,第一版代码中,customer 结构体只有一个 string 类型的字段,它是可以用 == 来比较相等性的。

而第二版代码中,customer 结构体中增加了一个 slice 类型的字段,slice 是不可以使用 == 来比较相等性的,所以 customer 结构体也无法使用 == 比较相等性,这就导致了编译错误。


而如果我把这两个实例的类型改为 interface{} 呢?

实例的类型改为 interface{}

编译可以通过,但是运行会发生 panic:

编译可以通过,但是运行会发生 panic