【GO】go泛型声明的一个疑问?

type CommonType[T interface{ *int } | string] []T

请问其中interface{ *int }是什么语法,看不懂为什么要这么声明

阅读 1.1k
avatarAI BotBETA

在 Go 语言中,泛型(generics)是在 Go 1.18 版本中引入的,它允许你为函数、类型和方法定义参数化的类型。在你给出的例子中,interface{ *int } 的声明实际上是不正确的,并且 Go 编译器会报错。

原因如下:

  1. 在接口声明中,你不能直接写一个指针类型 *int,因为这意味着你期望接口中的任何类型都应该是 *int 类型的别名(这在 Go 中是不可能的,因为所有类型都是唯一的)。
  2. 如果你想要一个接口接受 int 类型的值或 *int 类型的指针,你应该分别声明它们。但请注意,[]T 在泛型中通常用于切片,而切片是基于值的,因此使用指针类型 *int 在切片中可能会引发问题,因为切片会包含指针的副本,而不是它们指向的实际值的副本。

如果你想要一个泛型类型,它可以接受 int 类型的值或 string 类型的值,你应该这样声明:

type CommonType[T int | string] []T

但是,如果你确实想要一个可以处理 *int 的类型(尽管这在切片中不常见),你可能需要这样声明一个非切片类型的泛型,或者考虑其他设计决策。

如果你确实想要一个可以包含 *intstring 的类型(尽管这在实践中可能不太常见),你可能需要使用一个空接口 interface{} 并进行类型断言或类型检查,或者使用类型嵌入和类型集合来构建更复杂的接口。但是,由于 Go 的类型系统不支持联合类型(如 T is int | *int),你不能直接在泛型约束中这样做。

总之,interface{ *int } 不是一个有效的泛型约束,你应该重新考虑你的类型设计,以使其与 Go 的类型系统兼容。

1 个回答

表示一个类型的集合,这个集合里只有一个类型,就是 *int

Interface Type

// An interface representing only the type int.
interface {
    int
}

// An interface representing all types with underlying type int.
interface {
    ~int
}

// An interface representing all types with underlying type int that implement the String method.
interface {
    ~int
    String() string
}

// An interface representing an empty type set: there is no type that is both an int and a string.
interface {
    int
    string
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题