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

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- 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
}