Go 为什么你可以';t如果具有相同的';签名'?戈兰

Go 为什么你可以';t如果具有相同的';签名'?戈兰,go,Go,我想知道为什么函数不能与同类类型一起工作?请参见以下伪函数 游乐场: 因为它们是不同的类型 你想要的是一个接口,Go可以用它来保证类型包含相同的签名。接口包含编译器可以根据传入的类型检查的方法 以下是一个工作示例: Go不会根据您如何调用它来神奇地推断类型。只有当它能够保证调用站点的参数与输入接口的参数匹配时,它才会这样做。至于为什么-Y不是X,那么为什么它会工作呢 通过将typey转换为typex,如果它们确实相同,则可以轻松克服这一问题: useType((*typex)(y)) 但是,如

我想知道为什么函数不能与同类类型一起工作?请参见以下伪函数

游乐场:


因为它们是不同的类型

你想要的是一个接口,Go可以用它来保证类型包含相同的签名。接口包含编译器可以根据传入的类型检查的方法

以下是一个工作示例:


Go不会根据您如何调用它来神奇地推断类型。只有当它能够保证调用站点的参数与输入接口的参数匹配时,它才会这样做。

至于为什么-Y不是X,那么为什么它会工作呢

通过将typey转换为typex,如果它们确实相同,则可以轻松克服这一问题:

useType((*typex)(y))

但是,如果它们相同,为什么有两种类型?

这真的有效吗?这太可怕了:/+1。可怕可能是一个强有力的词。“我的意思是,像这样铸造它有点违背我迄今为止所看到的,”西蒙怀特黑德同意。然而,我把它放在这里是因为它也让我感到惊讶,它是可以做到的。@SimonWhitehead,这是有效的,因为typex和typey具有相同的底层类型,因此,可以进行转换。事实上,高尔夫球手在这里所做的不是定义:
typex结构{email,id string};typey-typex型参见@rvignacio这不是我所做的,而是问这个问题的人所做的:)这里不需要接口,因为类型很容易转换,如中所述。请注意,转换不是未检查的强制转换,而是编译时检查的转换,不会影响内存安全。在这种情况下,接口是多余的。另请参见。@nemo我现在明白了(我有几个星期的时间来更彻底地阅读这篇文章)。谢谢你的链接和解释。我确实喜欢它是编译时检查的-这确实让我对下面的答案感觉更好:)
useType((*typex)(y))