ホームページ > バックエンド開発 > Golang > Go で未知のデータ構造を反復するにはどうすればよいですか?

Go で未知のデータ構造を反復するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-17 15:46:10
オリジナル
487 人が閲覧しました

How Can I Iterate Over Unknown Data Structures in Go?

正確な型を知らずに Go でデータ構造を反復処理する

問題:

データ構造を反復処理するにはどうすればよいですか(配列またはマップ) の正確な知識がなくても、Go でtype?

失敗した試行:

以下のコードは、マップまたは配列を表すインターフェイスを反復処理し、各項目に対して関数を実行しようとしますが、失敗します。型チェックのため

func DoTheThingToAllTheThings(data_interface interface{}) int {
    var numThings int

    switch data := data_interface.(type) {
    case map[interface{}]interface{}:
        numThings = len(data)
        // ...
    case []interface{}:
        numThings = len(data)
        // ...
    default:
        fmt.Println("uh oh!")
    }

    return numThings
}
ログイン後にコピー

解決策:

fmt.Printf("%vn", data_interface) 関数は、型を使用せずにデータ構造を反復処理する方法を提供します。 Casting.

func PrintData(data_interface interface{}) {
    fmt.Printf("%v\n", data_interface)
}
ログイン後にコピー

これは、fmt.Printf の %v 動詞がリフレクションを使用しているため機能します。

Go のリフレクション:

fmt.Printf 関数は、内部で Reflect パッケージを使用して、引数の型を検査します。引数を入力し、それをフォーマットする方法を決定します。 reflect.ValueOf(arg) は引数の実際の値を表すreflect.Value オブジェクトを返し、reflect.TypeOf(arg) は値の型を返します。

例:

次のコードは Board 構造体を反映し、それを同じ新しい変数に再構成します。 type.

type Board struct {
    Tboard  [9]string
    Player1 Player
    Player2 Player
}

func main() {
    myBoard := makeBoard()

    v := reflect.ValueOf(*myBoard)
    t := v.Type()

    var b2 Board

    b2 = v.Interface().(Board)
    fmt.Printf("v converted back to: %#v\n", b2)
}
ログイン後にコピー

注:

リフレクションを使用するには、データ構造の型をエクスポートする必要があります。つまり、大文字で始まる必要があります。

以上がGo で未知のデータ構造を反復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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