Go 言語のマップは順序のないキーと値のペア型であり、キーに従って対応する値にアクセスできます。場合によっては、他の操作を容易にするために、マップ内のデータをスライス タイプに変換する必要があります。この記事では、golang マップをスライスに変換するいくつかの方法を紹介します。
方法 1: for ループを使用してマップを移動する
for ループを使用してマップを移動すると、マップ内のキーと値のペアを 1 つずつスライスに追加できます。具体的なコードは次のとおりです。
package main import "fmt" func main() { var m map[string]int m = make(map[string]int) m["one"] = 1 m["two"] = 2 m["three"] = 3 keys := make([]string, 0, len(m)) values := make([]int, 0, len(m)) for key, value := range m { keys = append(keys, key) values = append(values, value) } fmt.Println(keys) // [one two three] fmt.Println(values) // [1 2 3] }
方法 2: リフレクト ライブラリを使用する
reflect は Go 言語のリフレクション ライブラリで、型情報の取得、メソッドの呼び出し、構造体フィールドへのアクセス、等マップは、reflect.ValueOf() 関数を使用してreflect.Value タイプに変換でき、その後、reflect.Value メソッドを使用してキーと値のペアを取得できます。具体的なコードは次のとおりです。
package main import ( "fmt" "reflect" ) func main() { var m map[string]int m = make(map[string]int) m["one"] = 1 m["two"] = 2 m["three"] = 3 keys := reflect.ValueOf(m).MapKeys() values := make([]int, 0, len(keys)) for _, key := range keys { values = append(values, m[key.String()]) } fmt.Println(keys) // [one two three] fmt.Println(values) // [1 2 3] }
方法 3: github.com/mitchellh/mapstruct ライブラリを使用する
mapstruct は構造を解析するためのライブラリであり、構造体にマップします。 の対応するフィールドです。このライブラリは、スライス タイプを含む任意のタイプの go 値にマップを解析できる Decode() 関数を提供します。具体的なコードは次のとおりです。
package main import ( "fmt" "github.com/mitchellh/mapstructure" ) func main() { var m map[string]int m = make(map[string]int) m["one"] = 1 m["two"] = 2 m["three"] = 3 values := make([]int, 0, len(m)) err := mapstructure.Decode(m, &values) if err != nil { fmt.Println(err) } else { fmt.Println(values) // [1 2 3] } }
概要:
上記の 3 つのメソッドは、マップをスライス タイプに変換できます。このうち方法 1 は比較的性能が低く、小規模な地図変換に適しています。方法 2 ではリフレクション ライブラリを使用しますが、その効率は依然として方法 1 よりも高くなります。方法 3 は、サードパーティのライブラリを使用することです。これは便利で高速であり、マップ データが比較的複雑な状況に適しています。特定のシナリオに応じて、さまざまな変換方法を選択できます。
以上がgolang マップをスライスするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。