规则是,方法只能在命名类型和指向命名类型的指针上定义。
对于以下code ,
package main
type Cat struct {
}
func (c Cat) foo() {
// do stuff_
}
func (c *Cat) foo() {
// do stuff_
}
func main() {
}
编译器报错:
main.go:10: method redeclared: Cat.foo
method(Cat) func()
method(*Cat) func()
以上代码定义,
方法 foo()
用于命名类型 (Cat
) 和
方法 foo()
用于指向命名类型 (*Cat
) 的指针。
问题:
对于 GO 编译器,为什么要考虑为不同类型定义的方法 一样吗?
最佳答案
在 Go 中,接收器是一种语法糖。函数 (c Cat) foo()
的实际运行时签名是 foo(c Cat)
。接收器被移动到第一个参数。
Go 不支持名称重载。一个包中只能有一个名称为foo
的函数。
说完上面的语句,您会看到将有两个名为 foo
的函数,它们具有不同的签名。该语言不支持它。
你不能在 Go 中这样做。经验法则是为指针接收器编写一个方法,只要您有指针或值,Go 就会使用它。
如果您仍然需要两个变体,则需要以不同的方式命名方法。
关于GO - 方法重新声明错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41926900/