Problème :
Comment pouvons-nous parcourir une structure de données (tableau ou carte) en Go sans avoir une connaissance exacte de son type ?
Échec Tentative :
Le code ci-dessous tente de parcourir une interface représentant soit une carte, soit un tableau et d'exécuter une fonction sur chaque élément, mais il échoue en raison de problèmes de vérification de 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 }
Solution :
La fonction fmt.Printf("%vn", data_interface) fournit un moyen de parcourir la structure de données sans conversion de type.
func PrintData(data_interface interface{}) { fmt.Printf("%v\n", data_interface) }
Cela fonctionne car le verbe %v dans fmt.Printf utilise la réflexion pour déterminer le type de l'argument et l'imprimer en conséquence.
Reflection in Go :
La fonction fmt.Printf utilise en interne le package Reflect pour inspecter le type de l'argument et décider comment le formater. Le réflexion.ValueOf(arg) renvoie un objet réflexion.Value, qui représente la valeur réelle de l'argument, et réflexion.TypeOf(arg) renvoie le type de la valeur.
Exemple :
Le code suivant reflète une structure Board, puis la reconstitue en une nouvelle variable de la même 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) }
Remarque :
Pour utiliser la réflexion, le type de la structure de données doit être exporté, ce qui signifie qu'elle doit commencer par une lettre majuscule.
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!