2016-08-12 24 views
-1

假設我們有這樣的事情:轉:如何兩次嵌入相同的界面?

type ReadHandler interface { 
    Reader 
    Reader 
} 

很顯然,這會引起歧義,當我們要求Reader接口的成員的ReadHandeler實例。那麼我們如何在Golang中實現這一目標呢?

+1

接口描述的行爲。兩次嵌入接口就像是在說:「我想要這種行爲和這種行爲!」這似乎很奇怪。如果一個接口支持'foo()'而不是要求它也支持'foo()'是相當多餘的。 – Volker

回答

4

1-使用io.MultiReader,看到func MultiReader(readers ...Reader) 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 
} 
+0

謝謝,但我正在尋找一個通用的解決方案。你假設我想使用'Reader'接口,但這只是一個例子。假設我們想要嵌入一個接口(使用任意數量的方法),兩次在一個結構中。 – mahdix

+0

@mahdix:查看新的編輯(第3項) – 2016-08-12 04:00:01

相關問題