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 の厳密な型指定システムのため、このコードはコンパイル エラーで失敗します:
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
洗練されたソリューション: インターフェイスの採用
この制限を克服するエレガントな方法は、Go の強力なインターフェースを活用することです。 システム。配列のようなコレクションの重要なプロパティをカプセル化するインターフェイスを定義することで、次のような汎用ソリューションを作成できます。
type List interface { At(i int) interface{} Len() int } func printItems(header string, items List) { for i := 0; i < items.Len(); i++ { fmt.Print(items.At(i), " ") } fmt.Println() }
型固有の実装
For each具体的な型の場合は、List インターフェイスを実装します。
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) }
Example使用法
汎用コードを使用するには、具体的な配列をカスタム型でラップします。
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 サイトの他の関連記事を参照してください。