首页 > 后端开发 > Golang > Go 泛型如何处理联合及其在类型约束和容器中的限制?

Go 泛型如何处理联合及其在类型约束和容器中的限制?

DDD
发布: 2024-12-26 21:51:14
原创
498 人浏览过

How Do Go Generics Handle Unions and Their Limitations in Type Constraints and Containers?

Go 泛型 - 联合及其局限性

在 Go 中,联合有两个主要目的:

  1. 指定类型集接口约束: 联合允许您将泛型类型参数限制为一组特定的
  2. 包含近似元素:在联合中使用 ~ 符号表示可能包含其他兼容类型。

但是,这是至关重要的请注意,联合只能在接口约束中使用。 尝试将它们用作常规类型,例如 tt :=不支持 []testDifference[intOrString]。

此外,通用容器(例如切片)无法容纳不同类型的项目。虽然您的测试切片同时包含 testDifference[int] 和testDifference[string],这些具体实例化是不同的类型。

要解决这个问题,您可以为每种类型使用单独的切片(ttInts 和 ttStrs)或将所有项存储为接口([]interface{})。

联合约束上的操作仅限于类型集中所有类型都支持的操作。 int | 的情况字符串,包括变量声明、转换、比较、排序和运算符。

示例:

type intOrString interface {
    int | string
}

func beforeIntOrString[T intOrString](a, b T) bool {
    return a < b
}

func sumIntOrString[T intOrString](a, b T) T {
    return a + b
}

func main() {
    fmt.Println(beforeIntOrString("foo", "bar")) // false
    fmt.Println(beforeIntOrString(4, 5)) // true

    fmt.Println(sumIntOrString("foo", "bar")) // foobar
    fmt.Println(sumIntOrString(10, 5)) // 15
}
登录后复制

在此示例中,beforeSendIntOrString 和 sumIntOrString 是泛型函数分别适用于 int 和 string 值。

以上是Go 泛型如何处理联合及其在类型约束和容器中的限制?的详细内容。更多信息请关注PHP中文网其他相关文章!

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