将指针作为接口类型传递给函数
我是 Go 的新手,下面的行为让我感到困惑:
package main
type Contractor struct{}
func (Contractor) doSomething() {}
type Puller interface {
doSomething()
}
func process(p Puller) {
//some code
}
func main() {
t := Contractor{}
process(&t) //why this line of code doesn't generate error
}
在 Go 中一些类型和指向这个时候的指针是否符合接口?所以在我的例子中t和&t都是Puller?
回答
从Go 规范:
一个类型可能有一个与之关联的方法集。接口类型的方法集就是它的接口。任何其他类型的方法集
T
由所有声明为接收者类型的方法组成T。对应指针类型*T的方法集是所有用receiver*Tor声明T的方法的集合(也就是包含了的方法集T)。
在您的情况下,方法集&t(类型为*Contractor)是使用接收器*Contractor或声明的所有方法的集合Contractor,因此它包含方法doSomething()。
Go FAQ和Go 代码审查评论中也讨论了这一点。最后,许多过去的 Stack Overflow 问题都涵盖了这一点,例如this one or that one。