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

时间:2016-08-12 03:01:27

标签: go

假设我们有类似的东西:

type ReadHandler interface {
     Reader
     Reader
 }

显然,当我们在Reader的实例上调用ReadHandeler接口的成员时,会导致歧义。那么我们如何在Golang中实现这一目标呢?

1 个答案:

答案 0 :(得分:4)

1-使用io.MultiReader,请参阅func MultiReader(readers ...Reader) Reader文档:

  

MultiReader返回一个Reader的逻辑连接   提供输入读者。他们按顺序阅读。一旦所有输入   已经返回EOF,Read将返回EOF。如果有任何读者   返回非零,非EOF错误,Read将返回该错误。

2-或命名:

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

或:

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

演示工作示例代码:

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
}

输出:

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

3-命名它:

  

寻找嵌入接口的通用解决方案(带任意数字   方法),在结构中两次。

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

type my struct {
    Rdrs []io.Reader
}