一尘不染

具有相同名称和类型但类型不同的Golang方法

go

以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法:

type A struct {
  Name string
}

type B struct {
  Name string
}

func (a *A) Print() {
  fmt.Println(a.Name)
}

func (b *B) Print() {
  fmt.Println(b.Name)
}

func main() {

  a := &A{"A"}
  b := &B{"B"}

  a.Print()
  b.Print()
}

在控制台中显示所需的输出:

A
B

现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数:

func Print(a *A) {
  fmt.Println(a.Name)
}

func Print(b *B) {
  fmt.Println(b.Name)
}

func main() {

  a := &A{"A"}
  b := &B{"B"}

  Print(a)
  Print(b)
}

我什至无法编译程序:

./test.go:22: Print redeclared in this block
    previous declaration at ./test.go:18
./test.go:40: cannot use a (type *A) as type *B in function argument

:为什么 方法具有相同的名称和Arity ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型?


阅读 599

收藏
2020-07-02

共1个答案

一尘不染

因为Go不支持在其参数类型上重载用户定义的函数。

您可以改用其他名称创建函数,或者如果只想在一个参数(接收方)上“重载”,则可以使用方法。

2020-07-02