6.5 接口的组合

一、接口的组合

  1. 使用者一次性使用多个接口

  2. 具有更加丰富的灵活性

    // main中定义接口
    type Poster interface {
    	Post(url string, form map[string]string) string
    }
    
    // main中定义组合接口
    type RetrieverPoster interface {
    	Retriever
    	Poster
    }
    
    // main中实现组合接口
    // 接口组合
    func session(res RetrieverPoster) string {
    	res.Post(url, map[string]string{
    		"contents": "postTest",
    	})
    	return res.Get(url)
    }
    
    // main中调用方式
    fmt.Println(session(&retriever))

    备注:问题是,因为传参类型问题,造成组合接口中的数据无法传递,这就需要使用指针方式进行标记

    // 实现方式
    // 实现文件全部使用指针方式传参
    func (r *Retriever) Post(url string, form map[string]string) string {
    	r.Contents = form["contents"]
    	return "ok"
    }
    
    func (r *Retriever) Get(url string) string {
    	return r.Contents
    }
    
    // main文件中使用指针传递
    retriever := mock.Retriever{"this is "}
    r = &retriever
    
    // 注意:main中的遍历引用全部需要修改
    func inspect(r Retriever) {
    	fmt.Printf("%T %v \n", r, r)
    	switch v := r.(type) {
    	case *mock.Retriever:
    		fmt.Println("Contents:", v.Contents)
    	case *real.Retriever:
    		fmt.Println("UserAgent:", v.UserAgent)
    	}
    }

二、标准库中的接口组合方式

  1. io.ReadWriterCloser()

Last updated

Was this helpful?