[英]GO - method redeclared error
规则是,方法只能在命名类型和指向命名类型的指针上定义。
对于下面的代码,
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()
上面的代码定义,
命名类型( Cat
)的方法foo()
) 和
方法foo()
用于指向命名类型 ( *Cat
) 的指针。
题:
对于 GO 编译器,为什么为不同类型定义的方法被认为是相同的?
在 Go 中,接收器是一种语法糖。 函数(c Cat) foo()
的实际运行时签名是foo(c Cat)
。 接收器移动到第一个参数。
Go 不支持名称重载。 一个包中只能有一个名为foo
函数。
说了上面的陈述后,您会看到将有两个名为foo
函数具有不同的签名。 这种语言不支持。
你不能在 Go 中做到这一点。 经验法则是为指针接收器编写一个方法,只要有指针或值,Go 就会使用它。
如果您仍然需要两个变体,则需要对方法进行不同的命名。
例如,您可以像这样模拟一些猫科动物的行为:
package main
import (
"fmt"
)
type Growler interface{
Growl() bool
}
type Cat struct{
Name string
Age int
}
// *Cat is good for both objects and "object references" (pointers to objects)
func (c *Cat) Speak() bool{
fmt.Println("Meow!")
return true
}
func (c *Cat) Growl() bool{
fmt.Println("Grrr!")
return true
}
func main() {
var felix Cat // is not a pointer
felix.Speak() // works :-)
felix.Growl() // works :-)
var ginger *Cat = new(Cat)
ginger.Speak() // works :-)
ginger.Growl() // works :-)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.