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