ホームページ > バックエンド開発 > Golang > インターフェイスは Go の配列/スライスの共分散問題をどのように解決できるでしょうか?

インターフェイスは Go の配列/スライスの共分散問題をどのように解決できるでしょうか?

Susan Sarandon
リリース: 2024-12-29 10:06:11
オリジナル
953 人が閲覧しました

How Can Interfaces Solve Go's Array/Slice Covariance Problem?

Go での配列/スライスの共分散不足に対処するためのインターフェイスの利用

Go では、配列/スライスの共分散の欠如により、操作時に課題が生じます。異なるタイプの配列またはスライス。次のシナリオを考えてみましょう:

func printItems(header string, items []interface{}, fmtString string) {
  // ...
}

func main() {
  var iarr = []int{1, 2, 3}
  var farr = []float{1.0, 2.0, 3.0}
  printItems("Integer array:", iarr, "")
  printItems("Float array:", farr, "")
}
ログイン後にコピー

このコードは、汎用の printItems 関数を使用して整数配列と浮動小数点配列を出力しようとします。ただし、コレクションの共分散に関する Go の制限により、コンパイル エラーが発生します。

インターフェイスを使用した解決策

この制限を克服するための慣用的なアプローチは、インターフェイスを使用することです。リストのサイズとインデックス付けをカプセル化するインターフェイスを定義することで、さまざまなデータ型に対してそれを実装する型を作成できます。

type List interface {
    At(i int) interface{}
    Len() int
}

type IntList []int
type FloatList []float64

func (il IntList)   At(i int) interface{} { return il[i] }
func (fl FloatList) At(i int) interface{} { return fl[i] }

func (il IntList)   Len() int { return len(il) }
func (fl FloatList) Len() int { return len(fl) }
ログイン後にコピー

Usage

これらを使用型とインターフェイスが定義されているため、一般的にアクセスして出力できるようになりました。 arrays:

func printItems(header string, items List) {
    for i := 0; i < items.Len(); i++ {
        fmt.Print(items.At(i), " ")
    }
    fmt.Println()
}

func main() {
    var iarr = []int{1, 2, 3}
    var farr = []float64{1.0, 2.0, 3.0}
    printItems("Integer array:", IntList(iarr))
    printItems("Float array:", FloatList(farr))
}
ログイン後にコピー

結論

ジェネリックスはより洗練されたソリューションを提供しますが、インターフェイスの使用は Go でコレクションの共分散を処理するための堅牢なアプローチであることに変わりはありません。さまざまなデータ型を一般的な方法で使用します。

以上がインターフェイスは Go の配列/スライスの共分散問題をどのように解決できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート