2014-05-15 14 views
8

Poniższy kod działa poprawnie. Dwie metody pracy na dwóch różnych strukturach i drukowanie pole struct:Metody Golanga o tej samej nazwie i aricie, ale inny typ

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() 
} 

Pokazuje pożądany wynik w konsoli:

A 
B 

Teraz, jeśli zmienić podpis metody w następujący sposób dostaję błąd kompilacji. Po prostu przesuń odbiornik metody do argumentów metody:

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) 
} 

nawet nie mogę skompilować program:

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

Pytanie: Dlaczego jest to, że mogę zamienić typy struktur w odbiorniku, ale nie w argumentach , gdy metody mają taką samą nazwę i arytmetyczną?

Odpowiedz

22

Ponieważ Go nie obsługuje przeciążania funkcji zdefiniowanych przez użytkownika na ich typach argumentów.

Można uzyskać polimorfizm tylko za pomocą metod, przełączników, przełączników i kanałów.

+1

Dziękuję. Po prostu znalazłem: http://golang.org/doc/faq#overloading – Kiril

Powiązane problemy