繁体   English   中英

GO - 方法重新声明错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM