首页 > 后端开发 > Golang > Go 泛型中用于类型比较的'comparable”和'Ordered”约束有什么区别?

Go 泛型中用于类型比较的'comparable”和'Ordered”约束有什么区别?

Barbara Streisand
发布: 2024-12-10 14:36:11
原创
763 人浏览过

What's the Difference Between `comparable` and `Ordered` Constraints in Go Generics for Type Comparisons?

Go 泛型中的可比较约束与有序运算符

在 Go 泛型中,可比较约束限制支持相等运算符(== 和!=),而有序运算符(、=)则需要 Ordered

考虑以下代码:

import "fmt"

type numbers interface {
    int | int8 | int16 | int32 | int64 | float32 | float64
}

func getBiggerNumber[T numbers](t1, t2 T) T {
    if t1 > t2 {
        return t1
    }
    return t2
}

func getBiggerNumberWithComparable[T comparable](t1, t2 T) T {
    if t1 > t2 { // Compile error
        return t1
    }
    return t2
}

func main() {
    fmt.Println(getBiggerNumber(2.5, -4.0))
    fmt.Println(getBiggerNumberWithComparable(2.5, -4.0))
}
登录后复制

getBiggerNumberWithComparable 中出现错误是因为相当不能保证顺序比较。其中包括不支持排序的映射键类型。

Go 1.18 到 1.20 的解决方案

Go 1.21 之前,使用约束。有序:

import (
    "fmt"
    "golang.org/x/exp/constraints"
)

func getBiggerNumberWithOrdered[T constraints.Ordered](t1, t2 T) T {
    if t1 > t2 {
        return t1
    }
    return t2
}
登录后复制

Go 解决方案1.21

在 Go 1.21 及更高版本中,使用 cmp.Ordered:

import (
    "fmt"

    "golang.org/x/exp/constraints"
    "github.com/google/go-cmp/cmp"
)

func getBiggerNumberWithOrdered[T cmp.Ordered](t1, t2 T) T {
    if cmp.Less(t1, t2) {
        return t2
    }
    return t1
}
登录后复制

以上是Go 泛型中用于类型比较的'comparable”和'Ordered”约束有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板