请问为什么结构绑定的方法的接收者改成指针接收者以后,用结构声明的变量也别成了指针类型?

来源:6-5 接口的组合

慕粉329807310

2020-10-03

老师,请问为什么结构绑定的方法的接收者改成指针接收者以后,用结构声明的变量也别成了指针类型?如下,Retriever的Get和Post方法的接收者定义为指针类型,为什么 mock.Retriever{Contents: “This is a fake imooc.com”} 声明的变量 retriever 也变成了指针类型??如果一个结构里面,有的方法用指针接收者绑定,有的用值接收者绑定,用这个结构声明变量的时候,得到的变量是指针类型还是值类型??
/////////////////////////////////////////////////////////////////////////////
// mock.Retriver
/////////////////////////////////////////////////////////////////////////////
//Retriever …
type Retriever struct {
Contents string
}

//Get …
func (r *Retriever) Get(url string) string {
return r.Contents
}

//Post …
func (r *Retriever) Post(url string, form map[string]string) string {
r.Contents = form[“contents”]
return “ok”
}
/////////////////////////////////////////////////////////////////////////////
// main.go
/////////////////////////////////////////////////////////////////////////////

var r RetrievePoster
retriever := mock.Retriever{Contents: “This is a fake imooc.com”}
r = &retriever

写回答

1回答

liyanone

2020-10-08

首先接受者是指针和非指针的时候,声明出来的方法是不同的。所以真正实现了接口的类型是指向mock.Retriever结构体的指针。因此,声明了retriever后,如果要赋值给组合接口变量r,那么应该使用取地址符&,也就是要赋一个指针值,因为前面提到,真正实现了接口的是一个指针类型。

2
3
lichever
对的 实现接口方法是啥类型 就把这个类型 赋值给 接口变量
2021-07-16
共3条回复

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

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

5995 学习 · 1909 问题

查看课程