2009-11-13 6 views
3

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?

Répondre

9

L'intention est pour vous envelopper un type si vous voulez de nouvelles méthodes sur elle, de sorte que vous définiriez

type MyByteSize ByteSize 
func (b MyByteSize) String() string{ 

} 

Vous ne pouvez pas définir des méthodes sur un type extérieur du module, il a été défini je crois .

+4

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. –

+2

En outre, une conversion entre ByteSize et MyByteSize est libre IIRC, car la représentation interne est la même. –