2015-06-11 41 views
7

Jestem zdezorientowany przez metody golang na strukturach. Mam następujący wraz z samouczka, w którym mają:Czy wskaźniki są domyślnie odrzucane w metodach golang struct?

func (p *Page) save() error { 
    filename := p.Title + ".txt" 
    return ioutil.WriteFile(filename, p.Body, 0600) 
} 

Z mojego zrozumienia p jest wskaźnikiem i trzeba by nieprawidłowego wskaźnika przed pobraniem właściwość na przykład:

filename := (*p).Title + ".txt" 

Jedynym sposób ma to dla mnie sens, jeśli kropka działa jak -> w C++. czego mi brakuje?

+0

Nie jestem pewien, dlaczego zostałeś odrzucony, zaakceptuj moje wystąpienie. – getWeberForStackExchange

Odpowiedz

15

Tak, wskaźnik do struktury jest automatycznie dereferencjonowany. Od spec on selectors:

obowiązują następujące zasady do selektorów:

  1. Dla wartości x typu T lub *T gdzie T nie jest rodzajem wskaźnika lub interfejs x.f oznacza pola lub metody u najłagodniejsza głębokość w T gdzie jest taki f. Jeśli nie ma dokładnie jeden f z najłagodniejszą głębokość , wyrażenie selektora jest nielegalne.

...

  1. Jako wyjątek, jeśli typ x jest nazwany typ wskaźnik i (*x).f jest poprawne wyrażenie oznaczające selektor pola (ale nie method), x.f jest skrótem dla (*x).f.

Dlatego następujące dwie instrukcje są takie same (z których pierwszym jest preferowany):

filename := p.Title + ".txt" 
filename := (*p).Title + ".txt" 
+0

Dobrze wiedzieć! Przyjmę, kiedy będę mógł. – m0meni

1

Nie trzeba poważanie wskazówek lub użyć specjalnego operatora dostępu do dostępu do pól a struct w Go.

myRef := &ILikeCompositeLiteralInitilization{} 
fmt.Println(myRef.Dereferenced); 

jest funkcjonalnie równoważny;

fmt.Printn((*myRef).Dereferenced); 

Być może warto zauważyć, że zachowanie funkcji nie jest takie. To znaczy, musiałbym wyłuskać, aby wywołać metodę, która otrzymuje typ, jest wartością, a nie wskaźnikiem. TO ZNACZY;

func (*ILikeCompositeLiteralInitilization) PointerVersion() 
func (ILikeCompositeLiteralInitilization) ValueVersion() 

myRef.PointerVersion() // compiler likes this 

myRef.ValueVersion() // won't compile 

(*myRef).ValueVersion() // compiler is OK with this 

Zasadniczo, w przypadku funkcji nie występuje niejawny dereferencja lub adres operacji typu, kod nie zostanie skompilowany.

Powiązane problemy