web-dev-qa-db-fra.com

Pourquoi ne pas utiliser% v pour imprimer int et une chaîne

Je sais que pour imprimer int nous pouvons utiliser %d et string nous pouvons utiliser %s mais nous pouvons toujours utiliser %v pour les imprimer. Et si j'utilise toujours %v pour les imprimer? Quel problème se produira si je fais cela?

19
harrycmfan

Il ne se passera rien de mal, mais le verbe %d Indique au package fmt d'imprimer est un nombre (en utilisant la base 10), et le %v verbe signifie utiliser le format par défaut qui peut être remplacé.

Voir cet exemple:

type MyInt int

func (mi MyInt) String() string {
    return fmt.Sprint("*", int(mi), "*")
}

func main() {
    var mi MyInt = 2
    fmt.Printf("%d %v", mi, mi)
}

Sortie (essayez-le sur Go Playground ):

2 *2*

Lorsque vous utilisez le verbe %v, Le package fmt vérifie si la valeur implémente l'interface fmt.Stringer (qui est une seule String() string), et si c'est le cas, cette méthode sera appelée pour convertir la valeur en string (qui peut être formatée davantage si des indicateurs sont spécifiés).

La liste complète des règles de formatage se trouve dans le package doc de fmt, en citant la partie appropriée:

Sauf lors de l'impression à l'aide des verbes% T et% p, des considérations de mise en forme spéciales s'appliquent aux opérandes qui implémentent certaines interfaces. Par ordre d'application:

  1. Si l'opérande est une valeur reflect.Value, l'opérande est remplacé par la valeur concrète qu'il contient et l'impression continue avec la règle suivante.

  2. Si un opérande implémente l'interface Formatter, il sera invoqué. Le formateur permet un contrôle précis du formatage.

  3. Si le verbe% v est utilisé avec l'indicateur # (% # v) et que l'opérande implémente l'interface GoStringer, cela sera invoqué.

Si le format (qui est implicitement% v pour Println etc.) est valide pour une chaîne (% s% q% v% x% X), les deux règles suivantes s'appliquent:

  1. Si un opérande implémente l'interface d'erreur, la méthode Error sera invoquée pour convertir l'objet en une chaîne, qui sera ensuite formatée comme requis par le verbe (le cas échéant).

  2. Si un opérande implémente la méthode String () string, cette méthode sera invoquée pour convertir l'objet en une chaîne, qui sera ensuite formatée comme requis par le verbe (le cas échéant).

18
icza