首页 > 后端开发 > Golang > 为什么我的 Go 泛型类型参数不满足 `stringer` 接口?

为什么我的 Go 泛型类型参数不满足 `stringer` 接口?

Susan Sarandon
发布: 2024-12-25 11:10:13
原创
480 人浏览过

Why Doesn't My Go Generic Type Parameter Satisfy the `stringer` Interface?

理解 Go 中的泛型类型约束

在 Go 1.18 中,泛型提供了增强代码灵活性的强大工具。但是,在使用类型约束时,了解为什么会发生某些错误非常重要。

问题

考虑以下代码:

type stringer interface {
    a() string
}

func do(s stringer) {
    fmt.Println(s.a())
}

func blah[T FooBar]() {
    t := &T{}
    do(t)
}

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

尝试编译时这段代码,你可能会遇到错误:

cannot use t (variable of type *T) as type stringer in argument to do: *T does not implement stringer (type *T is pointer to type parameter, not type parameter)
登录后复制

理解错误

此错误源于对泛型类型约束如何工作的误解。 blah 函数中的约束 FooBar 是满足 FooBar 接口的类型的占位符。然而,变量 t 的类型为 T,它是指向类型参数 T 的指针。这意味着 T 本身不是类型参数,因此它不能满足 stringer 接口。

解决方案

这个问题的解决方案是引入类型参数T和stringer接口之间的关系。有两种可能的方法:

1。显式断言

您可以使用任何类型转换显式断言 *T 满足 stringer 接口:

func blah[T FooBar]() {
    t := &T{}
    do(any(t).(stringer))
}
登录后复制

2。类型组合

或者,您可以定义一个结合了 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 嵌入到 FooBar 接口中来确保类型安全,并且要求 T 是指针类型以满足约束FooBar.

结论

理解类型约束和类型参数之间的关系对于在 Go 中有效使用泛型至关重要。通过显式断言或类型组合引入 T 和 stringer 之间的关系,您可以解决错误并启用所需的行为。

以上是为什么我的 Go 泛型类型参数不满足 `stringer` 接口?的详细内容。更多信息请关注PHP中文网其他相关文章!

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