Wiem, że wskaźniki w Go pozwalają na mutację argumentów funkcji, ale czy nie byłoby prostsze, gdyby przyjęły tylko referencje (z odpowiednimi stałymi lub zmiennymi kwalifikatorami). Teraz mamy wskaźniki i niejawne przekazywanie przez odniesienie dla niektórych typów wbudowanych, takich jak mapy i kanały.
Czy coś mi brakuje, czy też wskazówki w Go to tylko niepotrzebna komplikacja?
Odpowiedzi:
Bardzo podoba mi się przykład wzięty z http://www.golang-book.com/8
w przeciwieństwie do
źródło
Wskaźniki są przydatne z kilku powodów. Wskaźniki umożliwiają kontrolę nad układem pamięci (wpływa na wydajność pamięci podręcznej procesora). W Go możemy zdefiniować strukturę, w której wszyscy członkowie są w ciągłej pamięci:
W tym przypadku
Point
struktury są osadzone wLineSegment
strukturze. Ale nie zawsze możesz bezpośrednio osadzać dane. Jeśli chcesz obsługiwać struktury, takie jak drzewa binarne lub lista połączona, musisz obsługiwać jakiś rodzaj wskaźnika.Java, Python itp. Nie ma tego problemu, ponieważ nie pozwala na osadzanie typów złożonych, więc nie ma potrzeby składniowego rozróżniania między osadzaniem a wskazywaniem.
Problemy ze strukturami języka Swift / C # rozwiązane za pomocą wskaźników Go
Możliwą alternatywą osiągnięcia tego samego jest rozróżnienie między
struct
i,class
jak C # i Swift. Ale to ma ograniczenia. Chociaż zwykle można określić, że funkcja przyjmuje strukturę jakoinout
parametr, aby uniknąć kopiowania struktury, nie pozwala to na przechowywanie odniesień (wskaźników) do struktur. Oznacza to, że nigdy nie możesz traktować struktury jako typu referencyjnego, jeśli uznasz to za przydatne, np. Do utworzenia alokatora puli (patrz poniżej).Niestandardowy alokator pamięci
Korzystając ze wskaźników, możesz również utworzyć własny alokator puli (jest to bardzo uproszczone, ponieważ usunięto wiele sprawdzeń, aby pokazać tylko zasadę):
Zamień dwie wartości
Wskaźniki pozwalają również na implementację
swap
. To jest zamiana wartości dwóch zmiennych:Wniosek
Java nigdy nie była w stanie w pełni zastąpić C ++ w programowaniu systemów w miejscach takich jak Google, po części dlatego, że wydajności nie można dostroić w takim samym stopniu z powodu braku możliwości kontrolowania układu i wykorzystania pamięci (błędy w pamięci podręcznej znacząco wpływają na wydajność). Go miał na celu zastąpienie C ++ w wielu obszarach i dlatego musi obsługiwać wskaźniki.
źródło
Odwołań nie można ponownie przypisać, podczas gdy wskaźniki mogą. Samo to sprawia, że wskaźniki są przydatne w wielu sytuacjach, w których nie można użyć odwołań.
źródło
Go ma być lakonicznym, minimalistycznym językiem. Zaczęło się więc od wartości i wskaźników. Później, z konieczności, dodano niektóre typy referencyjne (wycinki, mapy i kanały).
Język programowania Go: projektowanie języka Często zadawane pytania: Dlaczego mapy, wycinki i kanały są odniesieniami, a tablice są wartościami?
„Jest wiele historii na ten temat. Na początku mapy i kanały były wskaźnikami składniowymi i nie można było zadeklarować ani użyć instancji niebędącej wskaźnikiem. Ponadto zmagaliśmy się z tym, jak powinny działać tablice. Ostatecznie zdecydowaliśmy, że ścisłe oddzielenie wskaźników i wartości sprawiło, że język stał się trudniejszy w użyciu. Wprowadzenie typów referencyjnych, w tym wycinków obsługujących postać referencyjną tablic, rozwiązało te problemy. Typy referencyjne dodają do języka trochę godnej pożałowania złożoności, ale mają duży wpływ na użyteczność: Go bardziej produktywny i wygodny język, kiedy zostały wprowadzone ”.
Szybka kompilacja jest głównym celem projektowania języka programowania Go; to ma swoje koszty. Wydaje się, że jedną z ofiar jest możliwość oznaczania zmiennych (z wyjątkiem podstawowych stałych czasu kompilacji) i parametrów jako niezmiennych. Został poproszony, ale został odrzucony.
golang-nuts: idź na język. Kilka uwag i wątpliwości.
„Dodanie const do systemu typów wymusza jego pojawienie się wszędzie i wymusza usunięcie go wszędzie, jeśli coś się zmieni. Chociaż oznaczanie obiektów jako niezmiennych może przynosić pewne korzyści, nie sądzimy, że kwalifikator typu const jest odpowiedni iść."
źródło