ホームページ >バックエンド開発 >Golang >Go で互換性のある別のインターフェイスのスライスを期待する関数に 1 つのインターフェイスのスライスを渡すにはどうすればよいですか?

Go で互換性のある別のインターフェイスのスライスを期待する関数に 1 つのインターフェイスのスライスを渡すにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-24 20:53:17559ブラウズ

How to Pass a Slice of One Interface to a Function Expecting a Slice of a Different, Compatible Interface in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。