登录
首页 >  Golang >  Go问答

使用匿名函数进行多态传递

来源:stackoverflow

时间:2024-04-11 17:09:34 163浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《使用匿名函数进行多态传递》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

据我所知,当将一个函数作为输入传递到另一个函数时,它必须具有相同的契约 - 不允许使用如下接口的能力:(此处可运行示例:https://play.golang .org/p/lxvngziddgp)

package main


func main() {
    foo(processS1)
}

type I1 interface {
    bar()
}

type S1 struct {
}

func (s1 S1) bar() {
}

func processS1(s S1) {
}

func foo(func(I1)) {
}

从类型系统的角度来看,假设的问题是传递函数类型,而不是接口。但是,我看不出允许类型系统推断此处的关系会出现什么问题。我相信我在其他语言中见过这个。

go 不能/不支持这个有什么原因吗?


解决方案


简而言之,您定义的关系在任何类型语言中都无效。

您已将 foo 定义为采用类型 func(I1) 的函数。 func(S1) 是一种不同的类型。这些类型之间的关系的复杂性比简单的继承还要复杂。 golang 团队选择了简单性而不是解决函数类型和签名匹配。

使这些复杂性变得明显的一种方式是您实际上向后定义了关系。假设有一个 struct s2 也实现了 I1。另外,s1 有一个方法 baz()。

如果 foo 将 S2{} 传递给函数参数,它将实现 I1,但 processS1 将调用传入结构中不存在的函数。

可运行:https://play.golang.org/p/EvwQpCXhqTb

即使你交换了类型(https://play.golang.org/p/ItUx5pRJ6-g),它可以在没有恐慌的情况下运行,但它仍然无法在 golang 中工作。至于为什么golang不尝试解决这些问题,我不确定你会得到满意的答案。该团队以一般的哲学观点回答此类问题,例如:

方法匹配的简单性是该语言的一个特点。

我确实认为你在这里提出的问题确实有助于证明这种观点。这是一个复杂的问题,很难推理。不解决它比增加额外的复杂性更容易。

本篇关于《使用匿名函数进行多态传递》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>