首页 > 后端开发 > Golang > 如何解决 Go 泛型中的'无法使用 *T 类型的变量作为 stringer 类型”错误?

如何解决 Go 泛型中的'无法使用 *T 类型的变量作为 stringer 类型”错误?

Linda Hamilton
发布: 2024-12-20 15:22:10
原创
837 人浏览过

How Can I Resolve the

泛型中的类型安全注意事项

在 Go 的泛型中,类型参数 T 与约束接口 FooBar 不同。然而,这种区别提出了一个问题:如何将 T 的实例传递给需要实现 stringer 的类型的函数(就像这样做)?

理解错误

错误消息“不能使用 *T 类型的变量作为要执行的参数中的类型字符串”表明 blah 的参数 t 被错误识别为实现的类型纵梁。然而,T 本身并不具备这种方法。

解决问题

要实现 t 到 stringer 的转换,需要执行以下步骤:

  1. 为 FooBar 引入 stringer 接口:为 FooBar 添加 stringer FooBar 约束,允许所有满足 FooBar 的类型都有 stringer 方法。
  2. 更改 union 中的类型:修改 FooBar 约束以接受指向 foo 或 bar 的指针,作为接收器类型stringer 是一个指针。
  3. 将复合文字声明为指针:因为你不能声明在没有核心类型的约束上复合文字,需要将 t 声明为指针类型。
  4. 为 FooBar 引入类型参数:将 FooBar 中的类型并集提取到新的类型参数中确保 U 和 T 具有兼容的类型集。

最终代码

type FooBar[T foo | bar] interface {
    *T
    stringer
}

func blah[T foo | bar, U FooBar]() {
    var t T
    do(U(&t))
}

func main() {
    blah[foo]()
}
登录后复制

说明

现在,当调用blah时,T类型的变量t被声明为指针。 FooBar[T] 将 U 约束为包含指向 T 的指针的类型。将 &t 转换为 U 是有效的,并且 FooBar[T] (包括 stringer)的方法可供接收者 t 使用。

注意:

使用 FooBar 的类型参数允许传递参数并消除中间的需要诡计。例如,您可以将 blah 修改为:

func blah[T FooBar](t T) {
    do(t)
}
登录后复制

并用 blah(&foo{}) 调用它。

以上是如何解决 Go 泛型中的'无法使用 *T 类型的变量作为 stringer 类型”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板