2015-12-24 35 views
16

Jestem nowy w języku Go i mam tylko minimalne tło w C/C++, więc naturalnie zmagam się z pomysłem, kiedy używać wskaźników i kiedy nie używać wskaźników. Chociaż to pytanie może być uznane za otwarte, zastanawiam się, jakie są wytyczne dotyczące tego, kiedy zwracać konstrukcje i kiedy zwracać wskaźniki (i równoważnie, kiedy akceptować structs/pointers jako argumenty).Golang: kiedy używać wskaźników

Z tego co mogę odgadnąć, które z poniższych stwierdzeń są prawdziwe:

  1. elemencie są przekazywane do funkcji przez wartość. Oznacza to, że kopia struktury jest tworzona podczas przekazywania jej do funkcji.
  2. Jeśli chcę przekazać strukturę przez odniesienie, to zamiast tego użyłbym argumentu wskaźnikowego w definicji funkcji i użyłbym operatora addressof podczas wywoływania funkcji.
  3. Powodem, dla którego chciałbym przekazać strukturę przez odniesienie, jest fakt, że albo struktura, przez którą przechodzę, jest duża, i byłoby opodatkowanie pamięci, aby przekazać ją według wartości (mało prawdopodobne) lub jeśli chcę zrobić zmiany w kopii, którą przekazuję (bardziej prawdopodobne).
  4. Jako następstwo do 3.), powinienem przejść przez wartość, chyba że mam jeden z powyższych powodów, aby przejść przez odniesienie.

Czy moje założenia są prawidłowe? Czy też brakuje mi znaku na wskaźnikach?

+1

To w zasadzie to - nie jestem pewien, czy zadajesz więcej niż pytanie "tak" lub "nie". Odp .: # 2, dobrze jest pamiętać, że * wszystko * w Go jest przekazywane wartością, w tym przypadku podajesz wskaźnik według wartości. – JimB

+0

Jest to zasadniczo pytanie typu "tak/nie", ale gdyby było "nie", to chciałbym wiedzieć, co jest nie tak. Dzięki za wkład. Dla 2, czy poprawnie jest powiedzieć, że wskaźnik jest przekazywany przez wartość, ale używamy tego wskaźnika do modyfikowania obiektu, który wskazuje, ale jeśli przekazujemy strukturę (zamiast wskaźnika do tej struktury), to będziemy mogli kiedykolwiek modyfikować kopię? –

+1

tak, masz rację –

Odpowiedz

11

Twoje założenia są prawidłowe. Około 3, Go jest językiem współbieżnym, a przekazywanie przez odniesienie w gorutynach powoduje, że wszyscy czytają tę samą strukturę, która jest bezpieczna, ale także powoduje, że modyfikują tę samą strukturę, co jest niebezpieczne.