5 votes

pourquoi l'impression d'une tranche en utilisant fmt.Println(slice) est différente dans Golang

Code A :

package main

import "fmt"

func main() {
    slice := IntSlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    fmt.Println(slice)
}

type IntSlice []int

sortie A :

[0 1 2 3 4 5 6 7 8 9]

code B :

package main

import "fmt"

func main() {
    slice := IntSlice{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    fmt.Println(slice)
}

type IntSlice []int

func (slice IntSlice) Error() string { return "this is called." }

sortie B :

this is called.

pourquoi le comportement des fmt.Println(slice) est différent pour ces deux codes (A et B) ?
ou pourquoi fmt.Println(slice) appels slice.Error() automatiquement ?

7voto

Tim Cooper Points 55292

Il s'agit de documenté dans le cadre du comportement de fmt (souligné par moi) :

Sauf en cas d'impression à l'aide des verbes %T et %p, des considérations particulières de formatage s'appliquent aux opérandes qui mettent en œuvre certaines interfaces. Dans l'ordre d'application :

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

  2. Si un opérande implémente l'interface Formatter, celle-ci sera invoquée. 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, celle-ci sera invoquée.

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

  4. Si un opérande implémente l'interface error, la méthode Error sera invoquée pour convertir l'objet en une chaîne de caractères, qui sera ensuite formatée selon les exigences du verbe (le cas échéant).

  5. 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 de caractères, qui sera ensuite formatée selon les exigences du verbe (le cas échéant).

Pour les opérandes composés tels que les tranches et les structures, le format s'applique aux éléments de chaque opérande, de manière récursive, et non à l'opérande dans son ensemble. Ainsi, %q citera chaque élément d'une tranche de chaînes de caractères et %6.2f contrôlera le formatage de chaque élément d'un tableau à virgule flottante.

En fmt voit que slice met en œuvre error et imprime value.Error() plutôt que d'itérer sur la tranche et d'appliquer le formatage à chaque élément.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X