当前位置: 首页 > 知识库问答 >
问题:

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

景光赫
2024-06-26
type CommonType[T interface{ *int } | string] []T

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

共有2个答案

屠泰平
2024-06-26

表示一个类型的集合,这个集合里只有一个类型,就是 *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}
胡景澄
2024-06-26

在 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 的类型系统兼容。

 类似资料:
  • 从这节课开始我们就要正式开始学习 Go 语言的语法了,本文主要介绍了 Go 语言在代码中声明变量的几种方式,在 Go 语言中变量声明形式主要分为两种: 单变量声明 多变量声明 下面我们一一来看下这两种声明形式: 1. 单变量声明 Go 语言的变量声明需要使用关键字var,声明形式形如:var 变量名 变量类型,其中变量名由数字字母下划线组成,变量类型为 Go 语言内置支持的类型或者用户自定义类型。

  • 问题内容: 我正在学习中,文档和交互式课程说,空可以容纳任何类型,因为它不需要其他实现的方法。 举个例子: …将打印出来… 因此,我想我的问题是这是实现通用函数的方法,还是还有另一种更合适的方法来实现它们。 问题答案: Go范式通常是通过在非空接口中实现行为来避免这种情况。例如,假设您要打印特定于类型的格式的内容: 或者,您可以为知道如何进行字符串自身设置的接口定义一个接口(该接口在库中以形式存在

  • 主要内容:标准格式,批量格式,简短格式Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性。在数学概念中,变量表示没有固定值且可改变的数。但从计算机系统实现角度来看,变量是一段或多段用来存储数据的内存。 声明变量的一般形式是使用 var 关键字: var name type 其中,var 是声明变量的关键字,name 是变量名,type 是变量的类型。 需要注意的是,Go语言和许多编程语言

  • 问题内容: 我刚刚开始学习语言,但仍在尝试消化一些东西。 我写了一个函数为: 我真的很困惑或由于缺乏知识而无法理解的用例 。 问题答案: 我在“ 您可以在Go中一次声明多个变量吗? ”中提到过:解释了。 但是您需要具有与函数的每个参数相关联的类型,而上一个参数列表中并非如此。 顺序始终是,而不是遵循变量声明规范: 你会总能找到一个类型 后 一个:或

  • 主要内容:普通函数声明(定义),函数的返回值,调用函数函数构成了代码执行的逻辑结构,在Go语言中,函数的基本组成为:关键字 func、函数名、参数列表、返回值、函数体和返回语句,每一个程序都包含很多的函数,函数是基本的代码块。 因为Go语言是编译型语言,所以函数编写的顺序是无关紧要的,鉴于可读性的需求,最好把 main() 函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)。 编写多个函数的主要目的是将一个需要很多行代码的复

  • 问题内容: 最近,人们对Go提出了很多批评,因为它不支持泛型。这到底是什么意思呢?您如何向不熟悉这种动态类型语言(如Ruby)的人解释这一点? 问题答案: 在动态类型语言中,您不必关心列表是什么类型,而只是列表。但是,在静态类型的语言中,您确实在意列表的类型,因为类型是“ A的列表”,其中“ A”是某种类型。也就是说,a 与的类型不同。 因此,当您谈到泛型时,调用类型为列表中每个项目的某个函数时,

  • 请考虑以下代码: 在foo中,的类型将是。 我想在中创建一个变量,它的类型是的泛型,在本例中是。 有没有办法做到这一点?谢谢。 编辑不幸的是(我想)我无法重写签名,因为函数是用不同类型的对象调用的,例如

  • 刚开始学习java,在使用commons-dbutils操作数据库,对其进一步封装的时候,有下面两种方式: 为什么在方式2会存在Unchecked cast警告?