为什么当类型实现接口时,行为存在差异?

时间:2018-05-21 19:58:31

标签: go

谁可以告诉(或链接在哪里阅读),为什么当类型执行接口时 行为有所不同(取决于如何转移收件人)? 这样就可以了:

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)不匹配的错误。

1 个答案:

答案 0 :(得分:1)

原因是,当您将接收者签名更改为(p *Person)时,表示*Person实现了界面,而不是Person,因此您的"数据"数组必须更改为匹配。

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

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

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