最近我在使用 Go 官方出品的结构化日志包slog时,看到slog.Value源码中有一个比较好玩的小 Tips,可以限制两个结构体之间的相等性比较,本文就来跟大家分享下。在 Go 中结构体可以比较吗?在 Go 中结构体可以比较吗?这其实是我曾经面试过的一个问题,我们来做一个实验:定义如下结构体:type Normal struct {
a string
B int
}使用这个结构体分别声明 3 个变量n1、n2、n3,然后进行比较:n1 := Normal{
a: "a",
B: 10,
}
n2 := Normal{
a: "a",
B: 10,
}
n3 := Normal{
a: "b",
B: 20,
}
fmt.Println(n1 == n2)
fmt.Println(n1 == n3)执行示例代码,输出结果如下:$ go run main.go
true
false可见Normal结构体是可以比较的。如何让结构体不可比较?那么所有结构体都可以比较吗?显然不是,如果都可以比较,那么reflect.DeepEqual()就没有存在的必要了。定义如下结构体:type NoCompare struct {
a string
B map[string]int
}使用这个结构体分别声明 2 个变量
...
继续阅读
(180)