将指针作为接口类型传递给函数

我是 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。


以上是将指针作为接口类型传递给函数的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>