【发布时间】:2018-03-08 02:44:54
【问题描述】:
在链接的游乐场示例中,我定义了一个类型:
type DoMap map[int]func(Doer) string
Doer 在我定义的接口类型中的位置。
我在具体类型MyDoer 上实现接口。我希望能够构造一个DoMap,其中该映射的条目包含以下两个函数:
func(Doer) string // this works
func(*MyDoer) string // this doesn't
func(MyDoer) string // more-or-less the same idea, also doesn't
我不能,虽然很明显它们是不同的类型,但我想知道为什么我不能,因为函数确保我必须提供实现 Doer 的 MyDoer。
这还不足以确保我履行与该职能的合同吗?
还有其他方法可以实现吗?
https://play.golang.org/p/sJ2Rg3neL7
更新
一些 cmets 的形式是“它们不同”“这就是规范”,但我可以将 MyDoer 传递给接受 Doer 的函数 - 如果实现了接口:为什么将其放入地图改变结果?
更新 2
有一个要求解释“真正的问题”以及为什么我不能只使用类型映射的问题。我会尽力而为:
DoMap 不能是类型映射。我正在编写一个库,该库允许开发人员根据接受开发人员定义的类型(业务消息)的开发人员编写的函数(业务逻辑)的输出,简洁地定义状态机,这些状态机成功或失败转换。图书馆的存在是为了确保一系列转换可以在其他地方进行序列化和记录,然后由图书馆的第三方用户进行验证。我最初并没有这么说,因为它没有抓住重点——没有一个简单的答案。
现在我觉得我的无礼问题惹恼了每个人,而且由于我在快速拨号上没有确切的 Rob Pike,我可能会删除它,除非有人愿意相信我需要做什么我需要做,并提出一些建议。
【问题讨论】:
-
不,不够,签名不一样。你为什么要这样做? (这可能有助于其他人提出替代方案)。
-
" 我想知道为什么我不能,因为函数确保我必须提供一个实现 Doer 的 MyDoer。"这不会使类型相同。不同的类型是不同的类型。 Go 没有超类型,子类型也是超类型。这就是类型系统的工作原理。
-
Go 并不是真正的面向对象,尽管您可以通过多种方式模仿它。这不是其中之一。
-
因为你没有传递
Doer,你传递的是func(Doer) string,编译器不在乎MyDoer实现Doer,函数类型必须完全匹配。 -
你已经更新了你的问题,基本上说你理解但不喜欢这个答案。 这就是 Go 的工作原理。 您在
map中定义了一个特定的值类型,并且您必须使用该类型,句点。超出此范围的任何讨论都超出了 SO 的范围,可能更适合 Go 邮件列表之一。
标签: dictionary go types interface