異なるインターフェイスを含むスライスの型変換
Go では、1 つのスライスを渡す必要があるシナリオが発生する可能性があります。互換性のある別のインターフェイスのスライスを期待する関数へのインターフェイス。次の例を考えてみましょう。
<code class="go">type A interface { Close() error Read(b []byte) (int, error) } type B interface { Close() error } type Impl struct {} // Implementation of interface A and B func (I Impl) Close() error {...} func (I Impl) Read(b []byte) (int, error) {...}</code>
インターフェイスの互換性
この例では、インターフェイス A にはインターフェイス B が含まれています。つまり、A を実装するすべての型は B も実装します。結果として、Impl などの A の具体的な実装は、A と B の両方を満たします。
個々の値の受け渡し
関数間で個々の項目を渡そうとすると、期待どおりに機能します:
<code class="go">im := &Impl{} single(im) // works</code>
スライスの受け渡し
ただし、スライスを渡そうとすると、エラーが発生します:
<code class="go">list := []A{t} slice(list) // FAILS!</code>
エラーは次のとおりです: スライスへの引数で list (type []A) を type []io.Reader として使用することはできません
解決策
この問題を解決するには、次のことができます。目的のインターフェイス タイプの新しいスライスを手動で作成します:
<code class="go">ioReaders := make([]io.Reader, len(list)) for i, v := range list { ioReaders[i] = v } slice(ioReaders) // now works</code>
以上がGo で 1 つのインターフェイス タイプのスライスを別のインターフェイス タイプに変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。