Maison >développement back-end >Golang >Pourquoi les sorties « fmt.Printf » de Go diffèrent-elles lors de l'impression de pointeurs vers des structures et de pointeurs vers des valeurs de mappage ?
Pointeurs dans Go : comprendre le formatage Printf
Dans Go, les pointeurs jouent un rôle crucial dans la transmission des variables par référence. Cependant, leur utilisation peut parfois conduire à des résultats inattendus, comme le montre l'exemple de code fourni. Entrons dans les détails et résolvons les divergences.
Le problème :
Le code tente d'imprimer deux variables, l'une étant un pointeur vers une structure de test (&test1) et l'autre une valeur issue d'une carte (&test2). Le problème se pose lors de l'impression de ces valeurs, car elles produisent des sorties différentes.
L'explication :
La clé pour comprendre l'écart réside dans la fonction fmt.Printf. Cette fonction prend une chaîne de format et un nombre variable d'arguments de type interface{}. Lors du passage d'une valeur qui n'est pas de type interface{}, elle est automatiquement enveloppée dans une valeur d'interface{}.
Dans le premier cas, &test1 est de type *Test, et lorsqu'il est transmis à fmt.Printf, il est enveloppé dans une valeur interface{}. Le formatage par défaut des pointeurs est %p, qui imprime l'adresse hexadécimale de la valeur. Par conséquent, le résultat est "0xc00009e190".
En revanche, &test2 est de type *interface{}. Lorsqu'il est transmis à fmt.Printf, il est enveloppé dans une autre valeur d'interface{}. Le formatage par défaut des valeurs interface{} est %v et varie en fonction du type sous-jacent. Dans ce cas, le type sous-jacent est un pointeur vers interface{} et le format %v pour les pointeurs est %p. Par conséquent, la sortie est également une adresse hexadécimale, mais pour l'adresse de la valeur *interface{}, d'où "0xc00029c0a0".
La solution :
Pour obtenir une valeur de structure de test2, une assertion de type peut être utilisée. Cela suppose essentiellement que la valeur stockée dans test2 est une structure Test et la convertit de manière appropriée.
test2 := Models["test"].(Test)
Avec cette modification, test2 sera de type Test, et lorsqu'il sera transmis à fmt.Printf, il produira le même résultat que &test1.
Bonne pratique :
Il est généralement recommandé de stocker *Testez les valeurs directement dans la carte pour éviter d'avoir besoin d'assertions de type ou de déclarations de variables intermédiaires. Cela garantit que les valeurs d'interface stockées dans la carte sont déjà des pointeurs vers Test, qui peuvent être utilisées et transmises telles quelles.
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!