Golang Initialization décrit un moyen d'attacher des méthodes à un objet arbitraire dans le langage de programmation Go. À titre d'exemple, ils montrent une méthode String
pour un type ByteSize
nouvellement défini:Collisions de fonctions dans Go
type ByteSize float64
const (
_ = iota; // ignore first value by assigning to blank identifier
KB ByteSize = 1<<(10*iota);
MB;
GB;
TB;
PB;
YB;
)
La possibilité de joindre une méthode telle que chaîne à un type permet à ces valeurs se formate automatiquement pour l'impression, même partie d'un type général.
func (b ByteSize) String() string {
switch {
case b >= YB:
return fmt.Sprintf("%.2fYB", b/YB)
case b >= PB:
return fmt.Sprintf("%.2fPB", b/PB)
case b >= TB:
return fmt.Sprintf("%.2fTB", b/TB)
case b >= GB:
return fmt.Sprintf("%.2fGB", b/GB)
case b >= MB:
return fmt.Sprintf("%.2fMB", b/MB)
case b >= KB:
return fmt.Sprintf("%.2fKB", b/KB)
}
return fmt.Sprintf("%.2fB", b)
}
Ce qui est pas clair pour moi est la suivante: si ByteSize
et func (b ByteSize) String() string
sont toutes deux définies dans un paquet quelque part, j'importer ce paquet mais que vous voulez personnaliser l'affichage de ByteSize
en écrivant en utilisant ma propre méthode de chaîne, comment Aller savoir si appeler ma propre méthode de chaîne ou la méthode de chaîne précédemment définie? Est-il même possible de redéfinir la chaîne?
Droite. D'autres langues résolvent ce même problème en remplaçant une méthode sur une sous-classe. Mais dans Go, vous avez l'avantage que l'objet lui-même n'a pas à être du nouveau type. Vous pouvez obtenir un ByteSize de n'importe où, l'enregistrer dans une variable typée MyByteSize et utiliser votre propre méthode à la place. –
En outre, une conversion entre ByteSize et MyByteSize est libre IIRC, car la représentation interne est la même. –