首页 > 后端开发 > Golang > 为什么 Go 1.18 泛型中 `Pipe` 函数无法与兼容类型编译?

为什么 Go 1.18 泛型中 `Pipe` 函数无法与兼容类型编译?

DDD
发布: 2024-11-17 10:30:04
原创
506 人浏览过

Why Does the `Pipe` Function Fail to Compile with Compatible Types in Go 1.18 Generics?

Go 1.18 泛型中的逆变类型行为

Go 1.18 引入了泛型,它允许创建类型安全的代码。然而,某些行为可能与预期不同,例如逆变类型。

考虑 Go 1.18 中的以下函数:

此函数旨在将 left 的输出通过管道传递为输入到右边。但使用时却无法编译,如下所示:

这是因为编译器判定 T1 是 *os.File,虽然兼容,但与 io.Reader 并不相同。

所需的行为是将 Pipe 函数与接受兼容类型作为输入的函数链接起来。这与调用没有泛型的链时的预期行为一致。

问题:

  1. 是否有一种方法可以调整 Pipe 的签名以允许想要的行为?
  2. 这种行为是设计使然还是bug?

答案:

  1. 不,目前没有办法在 Go 1.18 中使用泛型来表达类型之间的兼容性。
  2. 此行为不是错误。反映了 Go 中缺乏对协变结果类型的支持。

解决方法:

虽然无法实现“编译时类型安全” " 行为,一种可能的解决方法是使用类型断言:

此代码在编译时不是类型安全的时间,但在某些情况下它可能会提供所需的功能。

以上是为什么 Go 1.18 泛型中 `Pipe` 函数无法与兼容类型编译?的详细内容。更多信息请关注PHP中文网其他相关文章!

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