Go でインターフェイスのスライスを別の互換性のあるインターフェイスに渡す
Go でインターフェイスを操作する場合、必要な状況が発生することがあります。最初のインターフェイスに 2 番目のインターフェイスが含まれているにもかかわらず、別のインターフェイスのスライスを期待する関数に、1 つのインターフェイスのスライスを渡す場合。
次の例を考えてみましょう。
<code class="go">type A interface { Close() error Read(b []byte) (int, error) } type Impl struct {} func (I Impl) Read(b []byte) (int, error) { fmt.Println("In read!") return 10, nil } func (I Impl) Close() error { fmt.Println("I am here!") return nil } func single(r io.Reader) { fmt.Println("in single") } func slice(r []io.Reader) { fmt.Println("in slice") } im := &Impl{} single(im) // works list := []A{im} slice(list) // fails: cannot use list (type []A) as type []io.Reader</code>
インターフェイス パラメーター io.Reader を持つ単一の関数への型 A の個々の項目は成功しますが、io.Reader のスライスを期待して A のスライスを関数スライスに渡そうとすると失敗します。
解決策:
残念ながら、この問題は Go の制限です。これを回避するには、目的のインターフェイス タイプの新しいスライスを作成し、既存のスライスの要素をそれに設定する必要があります。
<code class="go">newList := make([]io.Reader, len(list)) for i, elem := range list { newList[i] = elem } slice(newList) // now works</code>
以上がGo で互換性のある別のインターフェイスのスライスを期待する関数に 1 つのインターフェイスのスライスを渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。