直接看例子:
这里定义了一个 customer 结构体,在 main 函数里比较它的两个实例的值,这两个实例的字段的值是相同的。
那么,这个输出结果是 true 还是 false 呢?
答案是:true。
通过这个例子,我们至少可以得出一个结论:可以使用 == 来比较 customer 结构体的两个实例的相等性。
下面我们把代码稍作调整:
可能有人认为这个结果也是 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{} 呢?
编译可以通过,但是运行会发生 panic: