在 Go 中比较版本

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

如果您正在使用 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 。该文档提供了大量示例和有关您可以比较的字符串的大量详细信息。