首页 > 后端开发 > Golang > 正文

使用指向类型参数的指针创建泛型类型的实例

WBOY
发布: 2024-02-09 13:57:20
转载
1056人浏览过

使用指向类型参数的指针创建泛型类型的实例

php小编鱼仔在这篇文章中将介绍如何使用指向类型参数的指针来创建泛型类型的实例。泛型是一种在编程中广泛应用的概念,它允许我们在不指定具体类型的情况下编写通用的代码。在php中,虽然没有原生支持泛型的功能,但我们可以通过使用指向类型参数的指针来模拟实现泛型。这种方法可以让我们在编写代码时更加灵活和高效,提高代码的复用性和可维护性。在接下来的内容中,我们将详细介绍如何使用这种方法来创建泛型类型的实例,并给出一些实际应用的示例。

问题内容

给定这些类型定义:

type n interface{ ~int | ~float32 | ~float64 }

type s[t any] struct {
    t t
}

type myint int

type pspmyint[t myint] *s[*t]
type spmyint[t *myint,] s[t]
type spmyint2[t myint] s[*t]
登录后复制

我可以创建 type pspmyint 的 var

func createps[t myint]() pspmyint[t] {
    var i t
    s := s[*t]{t: &i}
    return &s
}
登录后复制

但我不知道如何创建 spmyint 或 spmyint2 的变量。

这个

func createSP[T myInt]() spMyInt2[T] {
    var i T
    s := S[*T]{t: &i}
    return s
}
登录后复制

编译失败 不能在return语句中使用s(s[*t]类型的变量)作为spmyint2[t]类型。

解决方法

首先,不要使用精确类型参数约束。这几乎没有任何意义。当您将函数声明为 createps[t myint]() 时,类型参数类型集的基数为 1,因此可以有效地由 myint 实例化永远。您可以像下面这样重写该函数:

65蜜蜂32705632

解决这个问题:

类型 s[*t] 与 spmyint2[t] 不同。但是,由于 spmyint2[t] 的底层类型是 s[*t],因此您可以简单地转换:

65蜜蜂32705638

至于 type spmyint[t *myint,] s[t] (其中逗号不是拼写错误,但需要避免解析歧义),事情并不那么简单。

问题在于类型参数不是其类型约束。因此,类型文字不能用于实例化不同的未命名类型文字。需要明确的是:

// naive attempt that doesn't compile
func createsp1[t myint]() spmyint[*t] {
    var i t
    s := s[*t]{t: &i}
    return spmyint[*t](s)
}
登录后复制

您可能认为 spmyint[t *myint] 有一个类型参数约束为 *myint 并且函数 t 受基本类型 myint 约束,因此 *t 应该满足 phpcnc phpcnt * myint。这是不正确的,因为类型文字 *t 不等于 *myint 的明显不明显的原因。所以实际上你不能为 type spmyint[t *myint,] s[t] 编写通用构造函数。

但是你很幸运,因为类型约束的基数为一。所以你可以删除类型参数:

func createSP1() spMyInt[*myInt] {
    var i myInt
    s := S[*myInt]{t: &i}
    return spMyInt[*myInt](s)
}
登录后复制

以上就是使用指向类型参数的指针创建泛型类型的实例的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号