主要观点总结
本文介绍了在Go语言中如何使结构体不可比较,包括通过不可比较字段和匿名字段_ [0]func()的实现方式。同时分享了Go官方出品的结构化日志包slog的源码中关于结构体不可比较的实例,并讨论了这种做法的推荐性和优雅性。
关键观点总结
关键观点1: 结构体在Go语言中的比较性取决于其字段是否全部可比较,而不是字段是否可导出。
如果结构体包含不可比较字段,如map或函数类型字段,则整个结构体将不可比较。
关键观点2: 使用匿名字段_ [0]func()可以有效禁止结构体的相等性比较。
这种方法具有不占用内存空间的优势,并且被Go社区推荐为优雅的做法。
关键观点3: 使用slog.Value源码中的例子展示了如何通过匿名字段实现结构体不可比较。
这个例子展示了如何在实践中应用这一技巧。
关键观点4: 本文提供了相关的示例源码和延伸阅读,以帮助读者进一步了解和理解这一主题。
包括slog源码链接、Golang Tip #50的链接和Go语言编程技巧的链接。
文章预览
最近我在使用 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() 就没有存在的
………………………………