ホームページ >バックエンド開発 >Golang >Go には配列/スライスの共分散がないため、異なるコレクション型を処理するための回避策が必要なのはなぜですか?

Go には配列/スライスの共分散がないため、異なるコレクション型を処理するための回避策が必要なのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-24 02:52:13484ブラウズ

Why Does Go's Lack of Array/Slice Covariance Require Workarounds for Handling Different Collection Types?

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, "")
}

Go にはジェネリックがないため、任意の型のコレクションを受け入れるジェネリック printItems 関数を定義できません。代わりに、次のエラーが発生します。

prog.go:26: cannot use iarr (type []int) as type []interface { } in function argument      
prog.go:27: cannot use farr (type []float) as type []interface { } in function argument

インターフェイスベースのソリューション

この制限を克服する一般的なアプローチの 1 つは、必要な動作を定義するインターフェイスを採用することです。私たちのコレクションのために。この場合、At (特定のインデックスにある項目を取得する) と Len (リストの長さを取得する) という 2 つのメソッドを使用して List インターフェイスを定義します。

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) }

これらの実装を配置すると、引数として List を受け入れるように printItems 関数を変更できるようになります。整数配列と浮動小数点配列の両方を出力します:

import "fmt"

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

メイン関数で、整数リストと浮動小数点リストを使用して printItems を呼び出し、目的の結果を達成します:

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))
}

Byインターフェイスを利用してコレクションの共通の操作セットを定義すると、ジェネリックスが存在しないにもかかわらず、ある程度の柔軟性とコードの再利用性を実現できます。行きましょう

以上がGo には配列/スライスの共分散がないため、異なるコレクション型を処理するための回避策が必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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