首页 >后端开发 >Golang >如何在 Go 中安全地将通用类型指针转换为特定接口?

如何在 Go 中安全地将通用类型指针转换为特定接口?

Barbara Streisand
Barbara Streisand原创
2024-12-11 16:57:22554浏览

How to Safely Convert a Generic Type Pointer to a Specific Interface in Go?

无法将泛型类型参数转换为特定类型

在 Go 中,使用泛型时,了解泛型类型参数与特定类型之间的关系非常重要他们的限制。在这种情况下,问题源于尝试将指向泛型类型参数 (*T) 的指针作为参数传递给需要特定接口(字符串器)的函数。

错误消息解释了 *T是一个指向类型参数的指针,但它没有实现 stringer 接口。这是因为 T (FooBar) 和 stringer 接口的约束没有本质上的联系。要解决这个问题,需要在两者之间建立关系。

解决方案 1:断言类型安全(不安全)

一种解决方案是断言 *T 是使用 any() 的纵梁。这允许您将指针作为参数传递,但它会牺牲类型安全性并可能导致运行时恐慌。

func blah[T FooBar]() {
    t := new(T)
    do(any(t).(stringer))
}

解决方案 2:参数化 FooBar(类型安全)

另一种解决方案是用泛型类型 T 来参数化 FooBar 接口,确保 FooBar 的类型参数和你传递给的类型参数一致巴拉比赛。这种方法保留了类型安全性,并允许您将指针传递给实现 stringer 接口的特定类型。

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

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

说明:

  • T 的约束现在是 foo 或 bar,并且 FooBar 使用 T 进行参数化。
  • 您可以创建指向特定类型的指针(例如,*foo)并将其传递给 blah,这将使用相应的类型实例化 FooBar。
  • 转换 U(&t) 现在有效,因为 U 和指向 T 的指针具有相同的类型集。

此解决方案使您能够传递实现 stringer 接口的特定类型的实例,并确保实例化期间的类型安全。

以上是如何在 Go 中安全地将通用类型指针转换为特定接口?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn