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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-25 06:01:02587ブラウズ

How to Pass Slices of Compatible Interfaces in Go?

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

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