请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

改写post函数遇到的问题

大家好,为什么我把post函数改写了一下,提示“invalid receiver Poster (pointer or interface type)”。这样写有什么问题吗?图片描述

正在回答 回答被采纳积分+3

1回答

ccmouse 2021-07-20 21:33:43

请帖一下完整代码。也可以考虑贴到https://play.studygolang.com/ 里

0 回复 有任何疑惑可以回复我~
  • 提问者 Eldin_Zhou #1
    请问单看这段代码的问题是什么呢?我就是将课程中的post函数改写了一下,其他没有变
    
    package main
    
    import (
    	"fmt"
    	"gotest/interface/mock"
    	"gotest/interface/real"
    	"time"
    )
    type Retriever interface {
    	//interface 里面全是函数,不需要加func关键字
    	Get(url string) string
    }
    type Poster interface{
    	Post(url string, form map[string] string) string
    }
    //把很多接口拼成一个接口
    type RetrieverPoster interface{
    	Retriever
    	Poster
    }
    const url = "http://www.imooc.com"
    func download(r Retriever) string {
    	return r.Get(url)
    }
    func  post(poster Poster) {
    	poster.Post(url,map[string]string{
    		"name": "yhang",
    		"course":"golang",
    	})
    }
    func session(s RetrieverPoster) string{
    	s.Post(url, map[string]string{
    		"contents":"another fake imooc website!",
    	})
    	return s.Get(url)
    }
    func inspect(r Retriever){
    	fmt.Println("Inspecting",r)
    	fmt.Printf("> %T %v\n", r, r)
    	switch r.(type){
    	case *mock.Retriever:
    		fmt.Println("this is mock one")
    	case *real.Retriever:
    		fmt.Println("this is real one")
    	}
    }
    回复 有任何疑惑可以回复我~ 2021-07-21 20:40:06
  • ccmouse 回复 提问者 Eldin_Zhou #2
    回复 Eldin_Zhou: 同学贴的这段代码没有问题,已经改对了。
    错误的代码是:func (poster Poster) post() {
    正确的代码是:func post(poster Poster) {
    
    这里括号在函数名前表示特殊的参数,叫做接收者,也就是出错信息里的receiver。它说了,Poster不能作为receiver,因为它是接口。
    
    只有自定义类型才能用这种“接收者”的方式定义方法,请参考第4章结构体和方法。
    回复 有任何疑惑可以回复我~ 2021-07-21 23:07:16
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号