专栏名称: GoCN
最具规模和生命力的 Go 开发者社区
今天看啥  ›  专栏  ›  GoCN

在 Go 中如何让结构体不可比较?

GoCN  · 公众号  ·  · 2024-06-24 22:31
    

主要观点总结

本文介绍了在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() 就没有存在的 ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览