首页 >后端开发 >Golang >Go泛型的联合约束可以在没有显式接口声明的情况下调用共享方法吗?

Go泛型的联合约束可以在没有显式接口声明的情况下调用共享方法吗?

Linda Hamilton
Linda Hamilton原创
2024-12-22 16:34:13572浏览

Can Go Generics' Union Constraints Call Shared Methods Without Explicit Interface Declaration?

在 Go 泛型中调用联合约束方法

在 Go 泛型(v1.18)中,您可能会遇到限制类型联合约束的类型将参数类型转换为实现统一接口的类型。然而,无法在受约束类型之间调用共享方法引起了人们对此类约束实用性的担忧。

考虑以下代码:

type A struct {}
type B struct {}
type AB interface { *A | *B }

func (a *A) some() bool { return true }
func (b *B) some() bool { return false }

func some[T AB](x T) bool { return x.some() } // Compiler error

编译器错误“x.some undefined”是由于类型联合约束 *A | *B 不保证 *A 和 *B 上都存在某个方法。

要解决此问题,可以将该方法添加到接口约束中:

type AB interface { *A | *B; some() bool }

func some[T AB](x T) bool { return x.some() } // Works

这个将 T 限制为同时实现 *A 或 *B 并声明 some 方法的类型。

但是,此解决方案被视为理想情况下与类型联合一起使用的解决方法 独自的。 Go 1.18 目前存在一些限制,即仅当方法 m 由 P 的约束接口显式声明时,编译器才支持对类型参数 P 的值调用方法。尽管语言规范规定接口的方法集是接口的类型集中每种类型的方法集的交集。这个问题预计会在 Go 1.19 中得到解决。

以上是Go泛型的联合约束可以在没有显式接口声明的情况下调用共享方法吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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