Zastrzeżenie: grałem w Go tylko przez jeden dzień, więc jest duża szansa, że wiele przegapiłem.
Czy ktoś wie, dlaczego w Go nie ma prawdziwego wsparcia dla typów ogólnych / szablonów / whatsInAName? Jest więc rodzaj ogólny map
, który jest dostarczany przez kompilator, podczas gdy programista Go nie może napisać własnej implementacji. Biorąc pod uwagę całą rozmowę o uczynieniu Go tak ortogonalnym, jak to tylko możliwe, dlaczego mogę UŻYWAĆ typu ogólnego, ale nie STWORZYĆ nowego?
Zwłaszcza jeśli chodzi o programowanie funkcjonalne, istnieją lambdy, a nawet domknięcia, ale w statycznym systemie typów brakuje typów ogólnych, jak napisać, no cóż, ogólne funkcje wyższego rzędu, takie jak filter(predicate, list)
? OK, powiązane listy i tym podobne można zrobić, interface{}
poświęcając bezpieczeństwo typów.
Ponieważ szybkie wyszukiwanie w SO / Google nie ujawniło żadnych spostrzeżeń, wygląda na to, że generics, jeśli w ogóle, zostaną dodane do Go po namyśle. Ufam, że Thompson radzi sobie znacznie lepiej niż ludzie z Java, ale po co trzymać z daleka generyczne? A może są zaplanowane i jeszcze nie wdrożone?
interface{}
poświęca bezpieczeństwo typu statycznego . Jednak jest to nieco dziwna skarga, gdy wspomina się o Schemacie w następnym akapicie, ponieważ Schemat zwykle nie ma statycznego sprawdzania typu.Odpowiedzi:
tę odpowiedź znajdziesz tutaj: http://golang.org/doc/faq#generics
źródło
interface{}
, jest najbardziej podstawowym typem interfejsu i każdy obiekt go zapewnia. Jeśli utworzysz pojemnik, który je zawiera, może przyjąć dowolny (nieprymitywny) obiekt. Jest więc bardzo podobny do konteneraObjects
w Javie.Idź 2
Projekt projektu leków generycznych jest dostępny pod adresem https://blog.golang.org/go2draft .
Idź 1
Russ Cox, jeden z weteranów Go, napisał na blogu post zatytułowany The Generic Dilemma , w którym pyta
Powolni programiści są wynikiem braku typów ogólnych, powolne kompilatory są spowodowane przez C ++, podobnie jak typy generyczne, a długie czasy wykonywania wynikają z podejścia typu boxing-unboxing, którego używa Java.
Czwarta możliwość niewymieniona na blogu to droga C #. Generowanie wyspecjalizowanego kodu jak w C ++, ale w czasie wykonywania, kiedy jest to potrzebne. Bardzo mi się podoba, ale Go bardzo różni się od C #, więc prawdopodobnie w ogóle nie ma zastosowania…
Powinienem wspomnieć, że używanie popularnej techniki programowania podobnego do Java 1.4 w ruchu, która rzutuje na,
interface{}
cierpi na dokładnie te same problemy, co boxing-unboxing (ponieważ to właśnie robimy), oprócz utraty bezpieczeństwa typu kompilacji. Dla małych typów (takich jak ints) Go optymalizujeinterface{}
typ tak, że lista int, które zostały rzutowane na interfejs {} zajmuje ciągły obszar pamięci i zajmuje tylko dwa razy więcej miejsca niż normalne wartości int.interface{}
Jednak nadal istnieje narzut związany z sprawdzaniem środowiska uruchomieniowego podczas przesyłania z . Odniesienie .Wszystkie projekty, które dodają obsługę standardową (jest ich kilka i wszystkie są interesujące) jednolicie przechodzą na ścieżkę C ++ generowania kodu czasu kompilacji.
źródło
[]interface{}
używają 2x więcej pamięci RAM niż[]int
. Chociaż prawda, nawet mniejsze typy (tj. Bajty) wykorzystują do 16 razy więcej pamięci RAM niż pliki[]byte
.Mimo że generyczne nie są obecnie wbudowane, istnieje kilka zewnętrznych implementacji typów generycznych dla go, które używają komentarzy w połączeniu z małymi narzędziami generującymi kod.
Oto jedna taka implementacja: http://clipperhouse.github.io/gen/
źródło
Właściwie zgodnie z tym postem:
źródło
W Go 2 rozważany jest polimorfizm parametryczny (generics) .
Takie podejście wprowadziłoby pojęcie kontraktu , którego można użyć do wyrażenia ograniczeń dotyczących parametrów typu:
Taka umowa mogłaby być następnie wykorzystana w ten sposób:
To propozycja na tym etapie.
Twoja
filter(predicate, list)
funkcja może zostać zaimplementowana z parametrem typu takim jak ten:W takim przypadku nie ma potrzeby ograniczania
T
.źródło