2012-10-16 6 views
6

Go consente di definire metodi separatamente dalla struct/datatype su cui lavorano. Significa solo flessibilità nel collocare le definizioni del metodo o qualcosa di più?Qual è il vantaggio di definire i metodi Go lontano dalle definizioni di struct?

Ho sentito il sistema di struct/methods di Go confrontato con il patch di scimmia, ma se ho capito bene, non si possono davvero aggiungere metodi a nessun tipo esistente (struct), poiché i metodi devono risiedere nello stesso pacchetto del genere. Vale a dire. puoi scimmiettare solo i tipi che sono sotto il tuo controllo comunque. O mi sta sfuggendo qualcosa?

In quali casi si definirà un tipo e i relativi metodi in file di origine separati (o in parti diverse dello stesso file sorgente)?

risposta

9

Questo è un vantaggio di Go su linguaggi basati Tipo: è possibile organizzare i file che vuoi:

  • si può mettere insieme tutte le funzioni simili, anche se ci sono molti tipi di ricevitore
  • voi può dividere un file che altrimenti sarebbe troppo grande

Come spesso, Go non ha aggiunto un vincolo che era inutile. Quindi la risposta potrebbe anche essere "perché no"?

davvero non si può aggiungere metodi a qualsiasi tipo esistente (struct), come i metodi devono risiedere nello stesso pacchetto come il tipo

Se si potesse, si potrebbe non essere in grado di determinare quale funzione chiamare con lo stesso nome funzione usato sulla stessa struttura in due pacchetti diversi. O questo renderebbe alcuni pacchetti incompatibili.

6

Monkey Patching non è possibile in viaggio. Il tipo su cui si definiscono i metodi deve risiedere nello stesso pacchetto.

Quello che puoi fare è definire funzioni e metodi ovunque tu voglia all'interno del pacchetto. Non importa se la definizione del tipo è nello stesso file della definizione del metodo per il tipo.

Ciò consente di raggruppare tutte le definizioni di tipo in un unico file e l'implementazione del metodo in un altro. Forse con altri helper che sono necessari con i metodi.

7

Questo è (in parte, probabilmente) perché in Go, è possibile avere metodi su qualsiasi tipo, non solo struct:

type Age uint 

func (a Age) Add(n Age) Age { 
    return a + n 
} 

Questo è anche come è possibile aggiungere i metodi per un tipo esistente. Quello che fai è definire un nuovo tipo basato su quel tipo esistente e aggiungere metodi a tuo piacimento.

+0

Non vedo come si aggiungano metodi a un tipo esistente: il tipo esistente è "uint" e, se ho capito correttamente, "Aggiungi" non funzionerà con "uint" -s. – Aivar

+0

Sì, ho preso una scorciatoia, non è possibile aggiungere un metodo a un tipo all'esterno del pacchetto, ma è possibile definire un nuovo tipo basato su uno esistente e aggiungere metodi a questo tipo. È quindi banale eseguire il cast del tipo base nel tipo potenziato per utilizzare questi metodi (ad esempio, cosa hanno fatto gli autori Go con il tipo StringSlice nel pacchetto di ordinamento). – mna

Problemi correlati