Go 为什么当一个类型实现一个接口时,行为会有所不同?

Go 为什么当一个类型实现一个接口时,行为会有所不同?,go,Go,谁能告诉(或链接到哪里阅读),为什么一个类型要实现一个接口 行为是否有差异(取决于如何转移收件人)? 这就是它的工作原理: type GetNamer interface { GetName() } type Person struct { PersonName string } func (p Person) GetName() { fmt.Println(p.PersonName) } type Data []GetNamer var d = Data{ Pers

谁能告诉(或链接到哪里阅读),为什么一个类型要实现一个接口 行为是否有差异(取决于如何转移收件人)? 这就是它的工作原理:

type GetNamer interface {
  GetName()
}

type Person struct {
  PersonName string
}

func (p Person) GetName() {
  fmt.Println(p.PersonName)
}

type Data []GetNamer

var d = Data{
    Person{"Vasya"},
  }
但是,如果我通过链接传递收件人:(p*Person)
我得到了一个类型(Person和GetNamer)不匹配的错误。

原因是当您将接收器签名更改为
(p*Person)
时,这意味着
*Person
实现了接口,而不是
Person
,因此您的“数据”数组必须更改为匹配

也就是说,您必须更改接口方法的签名和“d”变量的内容以包含Person指针,并且它应该可以工作,因为
&Person{…}
是一个
*Person
,它是一个GetNamer:

func (p *Person) GetName() {
  // ...
}

var d = Data{
  &Person{"Vasya"},
}