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回答

ccmouse

2021-07-25

因为RetrieverPoster是一个接口。接口我们几乎不会作为指针来使用,所以一定是s RetrieverPoster。

但接口的具体实现本身也是一个“结构”,它里面会放一个“值”,这个“值”可能是一个具体的对象的拷贝,也可能是一个指针。这就是我之前“接口的值类型”所要讲述的。

所以,这个形参s,永远都是RetrieverPoster,我不管它是怎么实现的,当然也不管它是不是用一个指针实现的。

那么我们这里实参这边retriever,它的Get方法中,接收者是(*Retriever),是一个指针类型,所以是&retriever实现了RetrieverPoster,而不是retriever。


0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程