当前位置: 首页 > article >正文

golang 如何定义一种能够与自身类型值进行比较的Interface

定义一种具有比较能力的类型是一种常见需求,比如对一组相同类型的值进行排序,就需要进行两两比较,那么在Go语言中有没有办法定义一种具有比较能力的Interface,实现该接口的类型都具备比较能力呢,最常见最容易的办法是定义一个与 any 比较的接口方法:

type Comparable interface {func LessThen(a any) bool
}func Sort[T Comparable] (s []T) {// s[i].LessThen(s[j])
}

具体实现的时候进行类型断言:

type User struct {Age int
}func(u *User) LessThen(a any) bool {u2, ok := a.(*User)if !ok {return false}return u.Age < u2.Age
}

多少缺点意思,没办法约束比较目标的类型与自己相同,于是我们想到可以利用 Go1.18 引入的范型来约束比较目标类型,于是 Comparable 定义改进为:

type Comparable[T any] interface {func LessThen(t T) bool
}

实现改变为:

// 实现接口 Comparable[*User]
func(u *User) LessThen(u2 *User) bool {return u.Age < u2.Age
}

随之 Sort 方法也要修改:

func Sort[T Comparable[*User]] (s []T) {// s[i].LessThen(s[j])
}

但这样的 Sort 方法限制了 T 只能与 *User 比较,要想 T 具有与自身类型比较的能力,Sort 定义需要再次修改:

func Sort[T Comparable[T]] (s []T) {// s[i].LessThen(s[j])
}

这样的 Sort 方法定义就比较通用了,基本实现了我们最初的目标,虽然看起来有点晦涩难懂,但好在接口实现比较简单, 比如:

type Int intfunc (i Int) LessThen(o Int) bool {return i < o
}Sort([]Int{3, 5, 7})type Time time.Timefunc (t Time) LessThen(t2 Time) bool {return time.Time(t).Before(time.Time(o))
}Sort([]Time{Time(time.Now()), Time(time.Now().Add(-time.Minute))})

期待后面版本的 Go 语言的 Interface 和范型加入对 self 的支持,这样的话我们的接口定义就会变得简单直接,比如:

// 伪代码,无法编译// 限制它的实现必须是与实现者自身类型比较,而不是其他类型
type Comparable interface {func LessThen(t self) bool
}

Golang 2 目前有一个提案就是讨论关于 self的: https://github.com/golang/go/issues/28254,有兴趣也可以关注参与

http://www.lryc.cn/news/2402411.html

相关文章:

  • Web前端之原生表格动态复杂合并行、Vue
  • 『uniapp』把接口的内容下载为txt本地保存 / 读取本地保存的txt文件内容(详细图文注释)
  • C/C++ 面试复习笔记(2)
  • 宝马集团推进数字化转型:强化生产物流与财务流程,全面引入SAP现代架构
  • 【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 时间事件处理部分)
  • 【DAY40】训练和测试的规范写法
  • C语言 标准I/O函数全面指南
  • el-select 实现分页加载,切换也数滚回到顶部,自定义高度
  • Langchaine4j 流式输出 (6)
  • Jenkins:自动化流水线的基石,开启 DevOps 新时代
  • 学习经验分享【40】目标检测热力图制作
  • C#里与嵌入式系统W5500网络通讯(3)
  • 用OpenNI2获取奥比中光Astra Pro输出的深度图(win,linux arm64 x64平台)
  • Unity VR/MR开发-VR设备与适用场景分析
  • Linux: network: switch:arp cache更新规则 [chatGPT]
  • Java网络编程API 1
  • Android协程学习
  • Angular报错:cann‘t bind to ngClass since it is‘t a known property of div
  • uniapp+vue3实现CK通信协议(基于jjc-tcpTools)
  • Python爬虫实战:研究urlparse库相关技术
  • 解锁FastAPI与MongoDB聚合管道的性能奥秘
  • 软件工程方法论:在确定性与不确定性的永恒之舞中寻找平衡
  • Unity中的MonoSingleton<T>与Singleton<T>
  • 怎么通过 jvmti 去 hook java 层函数
  • 兰亭妙微 | 医疗软件的界面设计能有多专业?
  • 前端原生构建交互式进度步骤组件(Progress Steps)
  • 如何给windos11 扩大C盘容量
  • 【基于阿里云搭建数据仓库(离线)】Data Studio创建资源与函数
  • Linux_T(Sticky Bit)粘滞位详解
  • web3-以太坊智能合约基础(理解智能合约Solidity)