dongshi2458 2016-08-12 03:01
浏览 17
已采纳

前往:如何两次嵌入相同的界面?

Suppose we have something like this:

type ReadHandler interface {
     Reader
     Reader
 }

Obviously, it will cause ambiguity when we call members of Reader interface on instances of ReadHandeler. So how can we achieve this in Golang?

  • 写回答

1条回答 默认 最新

  • dongpao9437 2016-08-12 03:07
    关注

    1- Use io.MultiReader, see func MultiReader(readers ...Reader) Reader Docs:

    MultiReader returns a Reader that's the logical concatenation of the provided input readers. They're read sequentially. Once all inputs have returned EOF, Read will return EOF. If any of the readers return a non-nil, non-EOF error, Read will return that error.


    2- or name it:

    type ReadHandler interface {
        Read(p []byte) (n int, err error)
        Read2(p []byte) (n int, err error)
    }
    

    or:

    type ReadHandler interface {
        io.Reader
        Read2(p []byte) (n int, err error)
    }
    

    Demonstration working sample code:

    package main
    
    import (
        "errors"
        "fmt"
        "io"
    )
    
    func main() {
        s := my{[]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, []byte{10, 20, 30, 40, 50}}
        buf := make([]byte, 5)
        n, e := s.Read(buf)
        fmt.Println(n, e, buf)
        n, e = s.Read2(buf)
        fmt.Println(n, e, buf)
    }
    
    type ReadHandler interface {
        io.Reader
        Read2(p []byte) (n int, err error)
    }
    
    type my struct {
        buf  []byte
        buf2 []byte
    }
    
    func (t *my) Read(p []byte) (n int, err error) {
        if len(p) > len(t.buf) {
            return 0, errors.New("len(p)>len(buf)")
        }
        m := copy(p, t.buf)
        return m, nil
    }
    
    func (t *my) Read2(p []byte) (n int, err error) {
        if len(p) > len(t.buf2) {
            return 0, errors.New("len(p)>len(buf2)")
        }
        m := copy(p, t.buf2)
        return m, nil
    }
    

    Output:

    5 <nil> [1 2 3 4 5]
    5 <nil> [10 20 30 40 50]
    

    3- name it:

    Looking for a general solution to embed an interface (with any number of methods), twice in a struct.

    type my struct {
        io.Reader
        Rdr2 io.Reader
    }
    

    or

    type my struct {
        Rdrs []io.Reader
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多