ホームページ > バックエンド開発 > Golang > 異なる要素タイプを扱うときに Go の配列/スライスの不変性を処理するにはどうすればよいですか?

異なる要素タイプを扱うときに Go の配列/スライスの不変性を処理するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-18 01:47:10
オリジナル
716 人が閲覧しました

How to Handle Go's Array/Slice Invariance When Working with Different Element 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 には配列/スライスの共分散がないため、エラーが発生します。具体的には:

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

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