在 Go 中比较版本

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

如果您正在使用 Go 并使用 语义版本控制 (SemVer), 有时您会想要比较 Go 应用程序中的版本。标准库没有可以做到这一点的包。幸运的是,有一些社区包可以提供帮助。在这里,我们将查看两个具有不同功能集的此类软件包。

github.com/hashicorp/go-version

专为 SemVer 设计,这个来自 Hashicorp 的 包有许多可以很好地协同工作的对象,为使用版本提供了基础。它包括比较版本、查看版本是否匹配一组约束,甚至订购一组版本的能力。

比较

为了比较两个版本,为每个版本创建一个 version.Version 对象,然后将两个版本比较为大于、小于或等于。例如:


 v1, err := version.NewVersion("1.0")
v2, err := version.NewVersion("1.1-beta1")
if v1.LessThan(v2) {
    fmt.Printf("%s is less than %s", v1, v2)
}

其他比较函数是 Equal GreaterThan

约束条件

有时您会想要将一个版本与一组约束进行比较。例如,您要确保版本大于 1.3,因为在该版本中添加了一项功能,并且小于 API 更改的版本 2.0。


 v1, err := version.NewVersion("1.0")
v2, err := version.NewVersion("1.1-beta1")
if v1.LessThan(v2) {
    fmt.Printf("%s is less than %s", v1, v2)
}

github.com/mcuadros/go-version

如果您有兴趣将版本作为字符串使用或处理不使用 SemVer 的版本,那么这个包可能更适合您。它的灵感来自 PHP 中的 Composer 和版本处理。

归一化然后比较

在比较版本字符串之前,您需要对其进行规范化。有一个方便的功能可以做到这一点。


 v1, err := version.NewVersion("1.0")
v2, err := version.NewVersion("1.1-beta1")
if v1.LessThan(v2) {
    fmt.Printf("%s is less than %s", v1, v2)
}

比较

这个包中有两个函数用于处理比较。


 v1, err := version.NewVersion("1.0")
v2, err := version.NewVersion("1.1-beta1")
if v1.LessThan(v2) {
    fmt.Printf("%s is less than %s", v1, v2)
}

如果第一个版本较新,则响应为 1 ,如果第二个版本较新,则响应为 -1 ,如果它们相同,则响应为 0

version.Compare 允许您使用比较字符串指定第三个参数。例如,


 v1, err := version.NewVersion("1.0")
v2, err := version.NewVersion("1.1-beta1")
if v1.LessThan(v2) {
    fmt.Printf("%s is less than %s", v1, v2)
}

这些的响应是 bool 值。

约束条件

与 Hashicorp 的包一样,您可以设置约束并查看版本是否与它们匹配。


 v1, err := version.NewVersion("1.0")
v2, err := version.NewVersion("1.1-beta1")
if v1.LessThan(v2) {
    fmt.Printf("%s is less than %s", v1, v2)
}

由于版本在限制范围内,因此响应为 true 。该文档提供了大量示例和有关您可以比较的字符串的大量详细信息。

相关文章