无法将泛型类型参数转换为特定类型
在 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)) }
说明:
此解决方案使您能够传递实现 stringer 接口的特定类型的实例,并确保实例化期间的类型安全。
以上是如何在 Go 中安全地将通用类型指针转换为特定接口?的详细内容。更多信息请关注PHP中文网其他相关文章!