La tua domanda indica correttamente che qualsiasi metodo è una funzione. Tuttavia, la lingua Go deve essere in grado di distinguere esplicitamente tra metodi e funzioni. La ragione di ciò è che i metodi hanno caratteristiche che le funzioni non hanno. La scelta di se Foo
è una funzione o un metodo che deve essere eseguito dal programmatore.
Il minimalismo di Go significa che la lingua definisce solo un piccolo insieme di parole chiave.Gli autori Go avrebbero potuto scegliere una nuova parola chiave, come ad esempio method
, per distinguere i metodi da funzioni:
method Foo(receiver *T, arg1 int) {} // 'Foo' is a method, not a function
Guardando in tutto il linguaggio di programmazione Go, possiamo vedere che la filosofia è quella di riutilizzare le parole chiave già esistenti piuttosto che avere una parola chiave separata per ogni occasione. Il for
parola chiave è un buon esempio di questo approccio:
for {} // Infinite loop
for a>0 {a--} // A while-do loop
for i := range channel {} // Receive values from a channel
for i:=0; i<N; i++ {} // C-style for loop
L'idea di base è che per il parser (and Go programmatori) per distinguere i vari tipi di for
loop gli uni dagli altri, non v'è alcuna necessità di introdurre un nuova parola chiave se le opzioni possono essere distinte dalla sintassi di ciò che viene dopo la parola chiave for
: ;
:=
range
identifier
..., il loro ordine sequenziale e la loro presenza/assenza.
La parola chiave func
segue lo stesso schema. Può essere utilizzato in più contesti:
- definizioni di funzioni:
func f() {}
- tipi di funzioni:
type F func(int) int
- metodo definizioni:
func (t T) SomeMethod() {}
- chiusure:
{ ...; go func(){c<-1}(); ...}
Dal punto di vista minimalista, un singolo La parola chiave func
è sia più semplice che più elegante di avere più parole chiave.
L'elenco dei parametri in più solo per il ricevitore
func (t *T) Foo(x int) {}
consente il parser di distinguere i metodi e funzioni:
func IDENTIFIER ... This is going to be a function
func (... This is going to be a method
Così, il parser (così come i programmatori Go) può fare la differenza in base al fatto che la parola chiave func
sia seguita da un identificatore o da (
.
La direzione che stai suggerendo è dove è andata la lingua Nim: http://nim-lang.org/docs/manual.html#procedures-method-call-syntax –