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

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.xdnf.cn/news/12146.html

相关文章:

  • 【论文解读】MemGPT: 迈向为操作系统的LLM
  • 13.4 AI颠覆语言学习:预录制视频+GPT-4评估如何实现60%成本降低与40%留存飙升
  • 阿里云域名怎么绑定
  • Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
  • React---day9
  • Python爬虫与Java爬虫深度对比:从原理到实战案例解析
  • 用函数实现模块化程序设计(适合考研、专升本)
  • 自定义注解facade 实现切面 进行日志记录和参数校验
  • Xcode 16.4 + iOS 18 系统运行时崩溃:___cxa_current_primary_exception 符号丢失的原因与解决方案
  • 用 n8n 提取静态网页内容:从 HTTP Request 到 HTML 节点全解析
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice在线编辑word文件保存数据同时保存文件
  • Ubuntu20.04设置为开机后直接自动进入纯命令行界面
  • mysql复合查询mysql子查询
  • 深度学习姿态估计实战:基于ONNX Runtime的YOLOv8 Pose部署全解析
  • IDEA:配置 Git 需要完成 Git 路径设置、账号认证以及仓库关联三个主要步骤
  • 目标检测实战:让AI“看见“并定位物体(superior哥AI系列第11期)
  • [Zynq] Zynq Linux 环境下 AXI UART Lite 使用方法详解(代码示例)
  • ArcGIS Pro 3.4 二次开发 - 宗地
  • HarmonyOS:如何在启动框架中初始化HMRouter
  • 【前端】vue3性能优化方案
  • 【Linux】Linux基础指令1
  • RPA+AI:自动化办公机器人开发指南
  • 基于值函数的强化学习算法之Double Q-Learning详解
  • 129、QT搭建FFmpeg环境
  • vue3+ts实现百度地图鼠标绘制多边形
  • 【websocket】安装与使用
  • 在word中点击zotero Add/Edit Citation没有反应的解决办法
  • 前端js获取当前经纬度(H5/pc/mac/window都可用)
  • 腾讯云V3签名
  • php apache构建 Web 服务器