首页 >后端开发 >Golang >Go 泛型中的波形符 (~) 有什么用?

Go 泛型中的波形符 (~) 有什么用?

Barbara Streisand
Barbara Streisand原创
2024-12-26 10:59:09277浏览

What is the Use of the Tilde Token (~) in Go Generics?

理解 Go 泛型中的波形符 (~)

Go 中波形符 (~) 的引入为泛型带来了新的维度编程。该令牌允许开发人员定义共享公共基础类型的类型。

什么是波形符令牌?

在 Go 中,波形符 (~) 表示集合具有基础类型 T 的所有类型。例如,~T 表示基础类型为 T 的所有类型。

为什么它有用吗?

波形符标记提供了一种灵活的方法来定义可以接受具有特定基础类型的类型的通用接口。例如,Ordered 接口可以定义为:

type Ordered interface {
  Integer | Float | ~string
}

此接口指定类型必须是 Integer、Float 或其基础类型为字符串的类型。这允许具有基础字符串类型的自定义类型(例如 MyString)满足此接口。

基础类型

基础类型的概念对于理解波形符至关重要令牌。类型 T 的基础类型通常是 T 本身,除了:

  • 对于预声明的数字、布尔或字符串类型,基础类型是类型本身。
  • 对于复合类型(结构体、切片等),底层类型是复合类型在其类型中引用的类型声明。

实际示例

使用波形符标记,可以创建约束来限制可以满足特定接口的类型。例如,可以将名为 ExactSigned 的约束定义为仅允许恰好为 int、int8、int16、int32 或 int64 的类型。这样的约束不允许像 MyInt8 这样的自定义类型。

另一方面,名为constraints.Signed 的约束使用 ~ 近似元素来允许基础类型为 int8 的类型。这允许像 MyInt8 这样的自定义类型满足约束。

语法糖

波形符标记可以在联合、匿名约束甚至语法糖中使用。值得注意的是,您可以使用单一类型的近似元素来简化约束的编写。

例如,以下匿名约束是等效的:

func echoFixedSize[T interface { ~int8 | ~int32 | ~int64 }](t T) { /* ... */ }

func echoFixedSizeSugar[T ~int8 | ~int32 | ~int64](t T) { /* ... */ }

func echoFixedSizeSugarOne[T ~int8](t T) { /* ... */ }

常见用例

近似元素对于处理需要具有方法的复合类型特别有用。例如,要允许为 ByteSeq 类型声明方法,其基础类型必须绑定到标识符:

type ByteSeq []byte

func (b ByteSeq) DoSomething() {}

通过在约束中指定 ~[]byte,可以实例化 ByteSeq作为有效类型。

限制

需要注意的是波形符标记不能与类型参数一起使用。例如,以下代码是无效的:

type AnyApprox[T any] interface {
  ~T
}

以上是Go 泛型中的波形符 (~) 有什么用?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn