Lorsque vous traitez diverses structures de données telles que des structures, des tranches de structures ou des cartes de structures, il est souvent nécessaire de convertir du type interface générique {} vers des types plus spécifiques pour le traitement. Cependant, la conversion de l'interface{} en carte peut poser des problèmes.
Dans l'extrait de code fourni :
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) }
Le processus de réflexion s'identifie correctement dans comme une carte. Cependant, l'accès aux valeurs de la carte à l'aide de la plage échoue avec l'erreur "ne peut pas dépasser v (type réflexion.Value)."
Une approche plus simple consiste à utiliser l'assertion de type :
v, ok := in.(map[string]*Book) if !ok { // Handle error or do something else } for _, s := range v { fmt.Printf("Value: %v\n", s) }
Cette vérification garantit que l'in peut être converti dans le type de carte souhaité. Alternativement, un commutateur de type peut être utilisé pour couvrir tous les types possibles.
Bien que la réflexion ne soit pas recommandée dans ce scénario, elle peut toujours être utilisée. avec Value.MapKeys pour récupérer les clés de la carte :
keys := v.MapKeys() for _, key := range keys { value := v.MapIndex(key) fmt.Printf("Key: %v, Value: %v\n", key.Interface(), value.Interface()) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!