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
柔軟なソリューション
この問題を回避する 1 つのアプローチは、これらの配列/スライスの共通属性を抽象化するインターフェイスを定義することです。
package main import "fmt" 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() } 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) } 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 サイトの他の関連記事を参照してください。