泛型中的类型安全注意事项
在 Go 的泛型中,类型参数 T 与约束接口 FooBar 不同。然而,这种区别提出了一个问题:如何将 T 的实例传递给需要实现 stringer 的类型的函数(就像这样做)?
理解错误
错误消息“不能使用 *T 类型的变量作为要执行的参数中的类型字符串”表明 blah 的参数 t 被错误识别为实现的类型纵梁。然而,T 本身并不具备这种方法。
解决问题
要实现 t 到 stringer 的转换,需要执行以下步骤:
最终代码
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中文网其他相关文章!