2014-05-15 1 views
8

Il seguente codice funziona correttamente. Due metodi di operare su due le strutture diverse e la stampa di un campo della struct:Metodi Golang con lo stesso nome e arità, ma tipo diverso

type A struct { 
    Name string 
} 

type B struct { 
    Name string 
} 

func (a *A) Print() { 
    fmt.Println(a.Name) 
} 

func (b *B) Print() { 
    fmt.Println(b.Name) 
} 

func main() { 

    a := &A{"A"} 
    b := &B{"B"} 

    a.Print() 
    b.Print() 
} 

mostra l'output desiderato nella console:

A 
B 

Ora, se cambio la firma del metodo nel seguente In questo modo ottengo un errore di compilazione. Ho appena spostare il ricevitore del metodo agli argomenti del metodo:

func Print(a *A) { 
    fmt.Println(a.Name) 
} 

func Print(b *B) { 
    fmt.Println(b.Name) 
} 

func main() { 

    a := &A{"A"} 
    b := &B{"B"} 

    Print(a) 
    Print(b) 
} 

non riesco nemmeno a compilare il programma:

./test.go:22: Print redeclared in this block 
    previous declaration at ./test.go:18 
./test.go:40: cannot use a (type *A) as type *B in function argument 

Domanda: perché è, che io possa interscambiare struct types nel ricevitore, ma non negli argomenti , quando i metodi hanno lo stesso nome e l'arità?

risposta

22

Perché Go non supporta l'overloading delle funzioni definite dall'utente nei relativi tipi di argomento.

È possibile ottenere il polimorfismo solo attraverso metodi, interruttori, interruttori di tipo e canali.

+1

Grazie. L'ho appena trovato: http://golang.org/doc/faq#overloading – Kiril