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

Mary-Kate Olsen
リリース: 2024-10-25 06:01:02
オリジナル
507 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!