Go で互換性のあるインターフェイスのスライスを渡す
Go では、あるインターフェイスのスライスを、インターフェイスのスライスを期待する関数に渡すときに問題が発生する可能性があります。たとえ前者に後者が含まれていても、異なるインターフェイスになります。この問題を説明するために、2 つのインターフェイス A と B を考えます。ここで、A には B が含まれます。
`
type A インターフェイス {
Close() error Read(b []byte) (int, error)
}
type Bインターフェイス {
Read(b []byte) (int, error)
}
`
具体的には、Impl 構造体は両方のインターフェイスを実装します。
`
type Impl struct {}
func (I Impl) Read(b []byte) (int, error) {
return 10, nil
}
func (I Impl) Close() error {
return nil
}
`
個々の項目は関数間で問題なく渡すことができますが、スライスを渡すとエラーが発生します:
`
func single(r io.Reader) {
fmt.Println("in single")
}
funclice(r []io.Reader) {
fmt.Println("in slice")
}
impl := &Impl{}
single(impl) / / works
list := []A{impl}
slice(list) // FAILS
`
これを解決するには、期待されるスライスの新しいスライスを作成する必要があります([]io.Reader) と入力し、ソース スライス ([]A) の要素を入力します:
`
newSlice := make([]io.Reader, len(list))
for i, v := range list {
newSlice[i] = v
}
slice(newSlice)
`
このアプローチにより、1 つのインターフェイスのスライスを関数に渡すことができます別の互換性のあるインターフェイスのスライスを期待し、元のスライスを直接渡そうとしたときに発生したエラーを解決します。
以上がGo で互換性のあるインターフェイスのスライスを渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。