Idź - wskaźniki
Wskaźniki w Go są łatwe i przyjemne do nauczenia. Niektóre zadania programistyczne w Go są łatwiejsze do wykonania za pomocą wskaźników, a innych zadań, takich jak wywołanie przez odniesienie, nie można wykonać bez użycia wskaźników. Dlatego konieczne jest nauczenie się wskaźników, aby zostać doskonałym programistą Go.
Jak wiadomo, każda zmienna jest miejscem w pamięci i każda lokalizacja pamięci ma zdefiniowany adres, do którego można uzyskać dostęp za pomocą operatora ampersand (&), który oznacza adres w pamięci. Rozważmy następujący przykład, w którym zostanie wyświetlony adres zdefiniowanych zmiennych -
package main
import "fmt"
func main() {
var a int = 10
fmt.Printf("Address of a variable: %x\n", &a )
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Address of a variable: 10328000
Więc zrozumiałeś, czym jest adres pamięci i jak uzyskać do niego dostęp. Zobaczmy teraz, jakie są wskaźniki.
Co to są wskaźniki?
ZA pointerjest zmienną, której wartością jest adres innej zmiennej, tj. bezpośredni adres miejsca w pamięci. Jak w przypadku każdej zmiennej lub stałej, należy zadeklarować wskaźnik, zanim będzie można go użyć do przechowywania adresu zmiennej. Ogólna postać deklaracji zmiennej wskaźnikowej to -
var var_name *var-type
Tutaj, typejest typem bazowym wskaźnika; musi to być prawidłowy typ danych C ivar-namejest nazwą zmiennej wskaźnika. Gwiazdka * użyta do zadeklarowania wskaźnika jest tą samą gwiazdką, której używasz do mnożenia. Jednak w tej instrukcji gwiazdka jest używana do oznaczenia zmiennej jako wskaźnika. Poniżej znajduje się prawidłowa deklaracja wskaźnika -
var ip *int /* pointer to an integer */
var fp *float32 /* pointer to a float */
Rzeczywisty typ danych wartości wszystkich wskaźników, niezależnie od tego, czy są to liczby całkowite, zmiennoprzecinkowe, czy inne, jest taki sam, długa liczba szesnastkowa, która reprezentuje adres pamięci. Jedyną różnicą między wskaźnikami różnych typów danych jest typ danych zmiennej lub stałej, na którą wskazuje wskaźnik.
Jak używać wskaźników?
Jest kilka ważnych operacji, które często wykonujemy za pomocą wskaźników: (a) definiujemy zmienne wskaźnikowe, (b) przypisujemy adres zmiennej do wskaźnika, oraz (c) uzyskujemy dostęp do wartości pod adresem przechowywanym w zmiennej wskaźnikowej .
Wszystkie te operacje są wykonywane przy użyciu operatora jednoargumentowego *, który zwraca wartość zmiennej znajdującej się pod adresem określonym przez jej operand. Poniższy przykład ilustruje sposób wykonywania tych operacji -
package main
import "fmt"
func main() {
var a int = 20 /* actual variable declaration */
var ip *int /* pointer variable declaration */
ip = &a /* store address of a in pointer variable*/
fmt.Printf("Address of a variable: %x\n", &a )
/* address stored in pointer variable */
fmt.Printf("Address stored in ip variable: %x\n", ip )
/* access the value using the pointer */
fmt.Printf("Value of *ip variable: %d\n", *ip )
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20
Brak wskaźników w Go
Kompilator Go przypisuje wartość Nil do zmiennej wskaźnika w przypadku, gdy nie masz dokładnego adresu do przypisania. Odbywa się to w momencie deklaracji zmiennej. Wskaźnik, któremu przypisano nil, nazywany jest anil wskaźnik.
Wskaźnik zerowy jest stałą o wartości zero zdefiniowaną w kilku standardowych bibliotekach. Rozważ następujący program -
package main
import "fmt"
func main() {
var ptr *int
fmt.Printf("The value of ptr is : %x\n", ptr )
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
The value of ptr is 0
W większości systemów operacyjnych programy nie mają dostępu do pamięci pod adresem 0, ponieważ pamięć ta jest zarezerwowana przez system operacyjny. Jednak adres pamięci 0 ma szczególne znaczenie; sygnalizuje, że wskaźnik nie ma wskazywać dostępnego miejsca w pamięci. Ale zgodnie z konwencją, jeśli wskaźnik zawiera wartość nil (zero), zakłada się, że nie wskazuje niczego.
Aby sprawdzić wskaźnik zerowy, możesz użyć instrukcji if w następujący sposób -
if(ptr != nil) /* succeeds if p is not nil */
if(ptr == nil) /* succeeds if p is null */
Szczegółowe wskazówki
Wskaźniki mają wiele, ale łatwych koncepcji i są bardzo ważne w programowaniu w Go. Następujące pojęcia wskaźników powinny być jasne dla programisty Go -
Sr.No | Koncepcja i opis |
---|---|
1 |
Idź - tablica wskaźników
Możesz zdefiniować tablice do przechowywania wielu wskaźników. |
2 |
Idź - wskaźnik do wskaźnika
Idź pozwala mieć wskaźnik na wskaźniku i tak dalej. |
3 |
Przekazywanie wskaźników do funkcji w Go
Przekazywanie argumentu przez odwołanie lub przez adres umożliwia zmianę przekazanego argumentu w funkcji wywołującej przez wywołaną funkcję. |