返回顶部
首页 > 资讯 > 后端开发 > GO >在 golang 1.18 中,逆变类型是如何结合泛型工作的?
  • 238
分享到

在 golang 1.18 中,逆变类型是如何结合泛型工作的?

2024-04-04 23:04:14 238人浏览 独家记忆
摘要

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《在 golang 1.18 中,逆变类型是如何结合泛型工作的?》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《在 golang 1.18 中,逆变类型是如何结合泛型工作的?》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习

问题内容

Golang 1.18 中,我想定义一个如下函数:

func pipe[a, t1, t2 any](left func(a) t1, right func(t1) t2) func(a) t2 {
    return func(a a) t2 {
        return right(left(a))
    }
}

例如left 函数的输出应该是 right 函数的输入,表示为泛型。

我注意到,对于以下示例,这无法按预期工作:

func openfile(name string) *os.file {
...
}

func readall(rdr io.reader) []byte {
...
}

var openread = pipe(openfile, readall)

编译失败,因为编译器认为 t1*os.file,尽管它与 io.reader 兼容,但并不完全相同。

如果我要在没有模板的情况下调用链,如下所示:

var result = ReadAll(OpenFile("test"))

然后编译器识别兼容类型。

问题:

  • golang 1.18 泛型中有没有办法修复 pipe 的签名以实现所需的行为?
  • golang 1.18 的行为是设计使然还是一个错误?


正确答案


  1. 没有。
  2. 不,不是错误。请参阅FAQ。

鉴于 go 不支持协变结果类型,您需要将 left 的结果转换为 right 接受的类型。然而,目前有 no way to express convertibility 个使用类型参数。

如果您愿意,可以根据该链接中的示例调整代码,您将得到类似 this 的内容,但请记住,它不是“编译时类型安全”。

func Pipe[A, T1, T2, T3 any](left func(A) T1, right func(T2) T3) func(A) T3 {
    return func(a A) T3 {
        return right(any(left(a)).(T2))
    }
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持编程网!更多关于Golang的相关知识,也可关注编程网公众号。

您可能感兴趣的文档:

--结束END--

本文标题: 在 golang 1.18 中,逆变类型是如何结合泛型工作的?

本文链接: https://lsjlt.com/news/595612.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作