GO - 方法重新声明错误

标签 go methods types

规则是,方法只能在命名类型和指向命名类型的指针上定义。


对于以下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/

相关文章:

sql - 应该使用什么 MySQL 数据类型和属性来存储大量 html 格式的数据?

go - 如何在Go中刷新tcp套接字?

arrays - 从 Golang 中的数组中选择元素的最惯用方法?

c++ - 指针和方法的奇怪用法

java - 将值返回给java中的main方法

c# - 如何找到最小协变类型以使两种类型之间最合适?

java - 促进原始类型

go - 如何在 golang 中将数组编码为二进制文件并将二进制文件编码为数组?

parsing - 如何解决 LR(1) 文法定义中的歧义?

methods - PubSub 和方法之间的区别