2012-10-16 8 views
6

Go pozwala definiować metody oddzielnie od struktury/typu danych, na którym pracują. Czy oznacza to tylko elastyczność w umieszczaniu definicji metod lub czegoś więcej?Jakie są korzyści z definiowania metod Go poza definicjami struct?

Słyszałem, że system Go/struct jest porównywany z łataniem małp, ale jeśli dobrze rozumiem, to naprawdę nie można dodawać metod do żadnego istniejącego typu (struct), ponieważ metody muszą znajdować się w tym samym pakiecie co rodzaj. To znaczy. możesz poprawiać małpy tylko te typy, które i tak masz pod kontrolą. Czy może czegoś brakuje?

W jakich przypadkach zdefiniowałbyś typ i jego metody w oddzielnych plikach źródłowych (lub w różnych częściach tego samego pliku źródłowego)?

Odpowiedz

9

Jest to zaletą przejść języków opartych typu: można organizować swoje pliki jak chcesz:

  • można umieścić wszystkie podobne funkcje razem, nawet jeśli istnieje wiele typów odbiorników
  • ci może podzielić plik, który w przeciwnym razie byłby zbyt duży.

Jak często Go nie dodawał ograniczenia, które było bezużyteczne. Tak więc odpowiedź może być również "dlaczego nie"?

naprawdę można nie dodawać do istniejących metod typu (struct), jako metody muszą znajdować się w tym samym opakowaniu jako typ

Jeśli można, to może nie być w stanie określić, które funkcje wywołać w przypadku tej samej nazwy funkcji używanej na tej samej strukturze w dwóch różnych pakietach. Lub sprawiłoby, że niektóre pakiety byłyby niekompatybilne.

6

Łata małpa nie jest możliwa w biegu. Typ, na którym definiujesz metody, musi znajdować się w tym samym pakiecie.

To, co możesz zrobić, to zdefiniować funkcje i metody w dowolnym miejscu w pakiecie. Nie ma znaczenia, czy definicja typu znajduje się w tym samym pliku, co definicja metody dla typu.

Umożliwia to grupowanie wszystkich definicji typów w jednym pliku i implementację metody w innym. Prawdopodobnie z innym pomocnikiem, którego potrzebują te metody.

7

To jest (częściowo, chyba), ponieważ w Go, można mieć metody na dowolny typu, nie tylko struct:

type Age uint 

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

To także, jak można dodać metod do istniejącego typu. To, co robisz, to definiowanie nowego typu w oparciu o istniejący typ i dodawanie metod, jak chcesz.

+0

Nie widzę sposobu dodawania metod do istniejącego typu - istniejący typ to "uint" i jeśli dobrze rozumiem "Dodaj" nie będzie działać z "uint" -s. – Aivar

+0

Tak, wybrałem skrót, nie można dodać metody do typu poza pakietem, ale można zdefiniować nowy typ na podstawie istniejącego i dodać metody do tego typu. W takim przypadku proste jest rzutowanie typu bazowego na typ rozszerzony w celu użycia tych metod (np. Co autorzy Go zrobili z typem StringSlice w pakiecie sortowania). – mna

Powiązane problemy