返回顶部
首页 > 资讯 > 精选 >获取不带类型参数的泛型结构的类型名称
  • 955
分享到

获取不带类型参数的泛型结构的类型名称

typedefoverflow 2024-02-13 13:02:14 955人浏览 泡泡鱼
摘要

PHP小编草莓在这篇文章中将向大家介绍如何获取不带类型参数的泛型结构的类型名称。泛型是一种强大的编程技术,可以在不指定具体类型的情况下编写通用的代码。然而,有时我们可能需要获取泛型结构

PHP小编草莓在这篇文章中将向大家介绍如何获取不带类型参数的泛型结构的类型名称。泛型是一种强大的编程技术,可以在不指定具体类型的情况下编写通用的代码。然而,有时我们可能需要获取泛型结构的类型名称,而不包含具体的类型参数。本文将为您详细解答这个问题,帮助您更好地理解和应用泛型编程。

问题内容

假设我有一个名为 foo 的通用结构,我从中创建了两个对象。我可以使用 reflect.typeof() 确定每个的具体类型,如下所示:

package main

import (
    "fmt"
    "reflect"
)

type foo[t any] struct {
    data t
}

func main() {
    a := foo[string]{"cheese"}
    b := foo[int]{42}

    fmt.println(reflect.typeof(a))
    fmt.println(reflect.typeof(b))
}

// main.foo[string]
// main.foo[int]

我感兴趣的是确定这些对象的通用类型(即 foo),而不是具体类型(即 foo[string]foo[int])。这是可能的还是我需要手动从这些字符串中提取通用类型(例如,使用正则表达式)?

编辑

正则表达式可能看起来像这样:

func GetGenericType(x any) string {
    // Get type as a string
    s := reflect.TypeOf(x).String()

    // Regex to run
    r := regexp.MustCompile(`\.(.*)\[`)

    // Return capture
    return r.FindStringSubmatch(s)[1]
}


fmt.Println(GetGenericType(a))
fmt.Println(GetGenericType(b))

// foo
// foo

我也看到了这个问题,但这并没有回答这个问题,因为它给出了具体类型(即 main.foo[string])而不是通用类型(即, foo)。

解决方法

反射看不到“基本”泛型类型的名称,因为在运行时该基本类型不存在。

Go 规范中的相关段落是 实例化:

实例化一个类型会产生一个新的非泛型命名类型;实例化一个函数会产生一个新的非泛型函数。

所以当你写:

b := foo[int]{42}
name := reflect.typeof(b).name()

该类型的名称正是 foo[int]

值得注意的是,不带类型参数列表的标识符 foo 在编译时是相关的,因为它可以防止您在同一个包中重新声明它。 类型定义:

类型定义创建一个新的、不同的类型,具有相同的类型 底层类型和操作作为给定类型并绑定 标识符,类型名称,给它。

typedef = identifier [ typeparameters ] type .

但是,如上所述,实例化会产生一个与 foo 不同的新命名类型;在运行时,当您可以使用反射时,您只处理实例化。

总之,我认为你的正则表达式解决方案是可以接受的,直到一些辅助函数被添加到stdlib中(如果有的话) 。为了清楚起见,将其重新发布到此处:

func getgenerictype(x any) string {
    // get type as a string
    s := reflect.typeof(x).string()

    // regex to run
    r := regexp.mustcompile(`\.(.*)\[`)

    // return capture
    return r.findstringsubmatch(s)[1]
}

请记住 type.string()type.name() 之间的区别:任何类型都可以有字符串表示形式,但只有命名类型才有名称。 (显然,对吧?)。例如,如果您写道:

b := &foo[int]{42}

那么b的类型为*foo[int],为匿名复合类型,name()返回空字符串。

以上就是获取不带类型参数的泛型结构的类型名称的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 获取不带类型参数的泛型结构的类型名称

本文链接: https://lsjlt.com/news/564106.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 获取不带类型参数的泛型结构的类型名称
    php小编草莓在这篇文章中将向大家介绍如何获取不带类型参数的泛型结构的类型名称。泛型是一种强大的编程技术,可以在不指定具体类型的情况下编写通用的代码。然而,有时我们可能需要获取泛型结构...
    99+
    2024-02-13
    typedef overflow
  • C#泛型类型参数的介绍
    这篇文章主要讲解了“C#泛型类型参数的介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#泛型类型参数的介绍”吧!C# 泛型类型参数在泛型类型或方法定义中,类型参数是客户端在实例化泛型类型...
    99+
    2023-06-17
  • Java 获取泛型的类型实例详解
    Java 获取泛型的类型实例详解Java 泛型实际上有很多缺陷,比如不能直接获取泛型的类型,不能获取带泛型类等。以下方式是不正确的:①.获取带泛型的类的类型Class lstUClazz = List<User>.class...
    99+
    2023-05-31
    java 泛型 类型
  • python泛型如何获取传入的类型
    Python中的泛型并不是强类型,因此无法直接获取传入的类型。 Python的类型注解主要是用来提供静态类型检查的,而在运行时并没有...
    99+
    2023-10-27
    python
  • Java中获取泛型类型信息的方法
    目录声明侧泛型使用侧泛型获取泛型类型相关方法1. Class类的泛型方法2. Field类的泛型方法3. Method类的泛型方法4. ParameterizedType类获取使用侧...
    99+
    2023-03-08
    Java获取泛型类型信息 Java 泛型类型信息
  • 如何在不进行类型检查的情况下获取泛型函数中类型的大小?
    积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《如何在不进行类型检查的情况下获取泛...
    99+
    2024-04-05
  • 无法推断函数构造函数的泛型参数中的类型
    php小编柚子将为大家解答一个常见的问题:在构造函数的泛型参数中,无法推断出类型的原因。在PHP中,泛型参数的类型推断是通过参数的默认值来实现的。然而,在构造函数中,由于参数是在对象创...
    99+
    2024-02-09
    编译错误
  • 使用指向类型参数的指针创建泛型类型的实例
    php小编鱼仔在这篇文章中将介绍如何使用指向类型参数的指针来创建泛型类型的实例。泛型是一种在编程中广泛应用的概念,它允许我们在不指定具体类型的情况下编写通用的代码。在php中,虽然没有...
    99+
    2024-02-09
  • 获取基于原始类型的类型的reflect.Kind
    在PHP编程中,获取基于原始类型的类型的reflect.Kind是一项重要的技能。reflect.Kind是PHP提供的反射类库中的一个属性,它可以用来确定一个变量的数据类型。通过使用...
    99+
    2024-02-09
    overflow
  • 为什么 Go 函数不能返回带有约束类型参数的类型?
    为什么Go函数不能返回带有约束类型参数的类型?这是一个经常引发疑惑的问题。在Go语言中,函数的返回类型不能是带有约束类型参数的类型,这主要是由于Go语言对泛型的支持较为有限所导致的。在...
    99+
    2024-02-09
    go语言
  • Go Reflection 获取当前字段名称,但在类型不匹配的非类型字符串上出现错误
    问题内容 type Issue struct { SysId uuid.UUID `json:"sysid" maelstrom:"required"` } func (i ...
    99+
    2024-02-06
  • TypeScript泛型参数默认类型和新的strict编译选项
    目录概述为组件类创建类型定义使用泛型类型定义 Props 和 State泛型参数默认类型其它事例新的--strict主要编译选项改进的--init输出--checkJS选项下.js文...
    99+
    2024-04-02
  • 带参数的全类型 Python 装饰器
    这篇短文中显示的代码取自我的小型开源项目按合同设计,它提供了一个类型化的装饰器。装饰器是一个非常有用的概念,你肯定会在网上找到很多关于它们的介绍。简单说,它们允许在每次调用装饰函数时(之前和之后)执行代码。通过这种方式,你可以修改函数参数或...
    99+
    2023-05-14
    Python 装饰器
  • MySQL的数据类型和表结构
    MySQL的数据类型和表结构 DB,DataBase-数据库:依照某种数据模型进行组织并存放到存储器的数据集合。 DNMS,DataBase Management System-数据库管理系统:用来操纵和管...
    99+
    2024-04-02
  • 泛型容器在 C++ 中的类型推断和别名?
    c++++ 中的类型推断和别名增强了泛型容器的灵活性,使其能够自动推断元素类型并使用更简洁的名称。具体来说:类型推断: 编译器自动推断容器及其元素的类型,简化了代码。别名: 可以定义别名...
    99+
    2024-04-24
    类型推断 别名 c++
  • 泛型函数在Golang中解决可变参数类型的问题吗?
    go 中的泛型函数解决了可变参数类型的问题:泛型函数允许使用类型参数,在运行时指定。这使得编写可以处理不同类型参数的函数成为可能。例如,max 函数是一个泛型函数,它接受两个可比较参数并...
    99+
    2024-04-16
    golang 泛型
  • 总结Python函数参数的六种类型
    目录一、函数的单参数传递二、多参数传递三、关键字参数四、缺省参数五、不定长参数 - 元组六、不定长参数 - 字典前言: Python函数之所以很好用,还有一点就的能传递参数实现不同场...
    99+
    2024-04-02
  • Golang泛型如何在函数中处理不同类型的数据?
    go 泛型通过类型参数允许函数处理不同类型的数据。通过使用可比较类型参数 t,max 函数可以返回两个值中较大的那个,适用于任何可比较类型。 Go 泛型:在函数中处理不同类型数据 Go...
    99+
    2024-04-17
    golang 泛型
  • 获取MySQL中变量的类型?
    无法获取 MySQL 中变量的类型。使用 CAST 运算符将变量的类型转换为另一个类型。语法如下 -SET @yourVariableName:=’anyValue’使用 CAST 运算符转换为另一种类型。语法如下 ...
    99+
    2023-10-22
  • 如何使用泛型 Go 实例化类型参数的非零指针?
    php小编西瓜将为您介绍如何在Go语言中使用泛型实例化类型参数的非零指针。在Go语言中,泛型是一种强大的特性,可以增加代码的灵活性和重用性。当我们需要在泛型函数或方法中实例化一个非零指...
    99+
    2024-02-11
    go语言 排列
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作