構造体、構造体のスライス、構造体のマップなどのさまざまなデータ構造を扱う場合、多くの場合、変換が必要になります。汎用インターフェース タイプからより具体的なタイプに変換して処理します。{}ただし、インターフェースからマップへの変換には課題が生じる可能性があります。
提供されたコード スニペット内:
func process(in interface{}, isSlice bool, isMap bool) { v := reflect.ValueOf(in) if isMap { for _, s := range v { fmt.Printf("Value: %v\n", s.Interface()) } } } func main() { m := make(map[string]*Book) m["1"] = &b process(m, false, true) }
リフレクション プロセスは、次のように正しく識別します。{}地図として。ただし、range を使用してマップ値にアクセスすると、「v (typereflect.Value) を範囲指定できません」というエラーが発生して失敗します。
より簡単なアプローチは、型アサーションを使用することです。
v, ok := in.(map[string]*Book) if !ok { // Handle error or do something else } for _, s := range v { fmt.Printf("Value: %v\n", s) }
このチェックにより、in を目的のマップ タイプにキャストできることが保証されます。あるいは、型スイッチを使用して、考えられるすべての型をカバーすることもできます。
このシナリオではリフレクションは推奨されませんが、引き続き使用できます。 Value.MapKeys を使用してマップのキーを取得します:
keys := v.MapKeys() for _, key := range keys { value := v.MapIndex(key) fmt.Printf("Key: %v, Value: %v\n", key.Interface(), value.Interface()) }
以上がGo でインターフェースをマップに安全に変換するにはどうすればよいですか?{}の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。