fmt.Println(session(&retriever)) 和 func session(s RetrieverPoster) string {
来源:6-5 接口的组合

Zayn_zhang
2021-07-22
老师,请教一下,在接口组合这一章节中有以下两个小片段:
实参:
fmt.Println(session(&retriever))
形参:
func session(s RetrieverPoster) string {
请问:为什么不是*RetrieverPoster? 谢谢!
写回答
1回答
-
因为RetrieverPoster是一个接口。接口我们几乎不会作为指针来使用,所以一定是s RetrieverPoster。
但接口的具体实现本身也是一个“结构”,它里面会放一个“值”,这个“值”可能是一个具体的对象的拷贝,也可能是一个指针。这就是我之前“接口的值类型”所要讲述的。
所以,这个形参s,永远都是RetrieverPoster,我不管它是怎么实现的,当然也不管它是不是用一个指针实现的。
那么我们这里实参这边retriever,它的Get方法中,接收者是(*Retriever),是一个指针类型,所以是&retriever实现了RetrieverPoster,而不是retriever。
00
相似问题