假設我們有這樣的事情:轉:如何兩次嵌入相同的界面?
type ReadHandler interface {
Reader
Reader
}
很顯然,這會引起歧義,當我們要求Reader
接口的成員的ReadHandeler
實例。那麼我們如何在Golang中實現這一目標呢?
假設我們有這樣的事情:轉:如何兩次嵌入相同的界面?
type ReadHandler interface {
Reader
Reader
}
很顯然,這會引起歧義,當我們要求Reader
接口的成員的ReadHandeler
實例。那麼我們如何在Golang中實現這一目標呢?
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
}
謝謝,但我正在尋找一個通用的解決方案。你假設我想使用'Reader'接口,但這只是一個例子。假設我們想要嵌入一個接口(使用任意數量的方法),兩次在一個結構中。 – mahdix
@mahdix:查看新的編輯(第3項) – 2016-08-12 04:00:01
接口描述的行爲。兩次嵌入接口就像是在說:「我想要這種行爲和這種行爲!」這似乎很奇怪。如果一個接口支持'foo()'而不是要求它也支持'foo()'是相當多餘的。 – Volker