In Go is een pointer een variabele die het adres van een andere variabele opslaat. In tegenstelling tot sommige talen is pointer-aritmetiek niet mogelijk in Go, wat ze veiliger maakt. Pointers worden in Go vaak gebruikt voor:
In Go is er geen expliciete ondersteuning voor referentietypes, zoals in C++, maar slices en maps zijn van nature al referentieel, en worden vaak op waarde doorgegeven.
package main import "fmt" type User struct { Name string } func changeNameByValue(u User) { u.Name = "Vasya" } func changeNameByPointer(u *User) { u.Name = "Petya" } func main() { user := User{Name: "Ivan"} changeNameByValue(user) fmt.Println(user.Name) // Ivan changeNameByPointer(&user) fmt.Println(user.Name) // Petya }
Kunnen pointers naar constanten of literalen wijzen in Go?
Juiste antwoord: Nee, in Go kan je het adres van een constante of een literal niet direct nemen. Je kunt alleen het adres van een variabele nemen:
x := 5 p := &x // OK p2 := &10 // Compilatiefout
Dit wordt vaak verward met talen waar dit wel is toegestaan.
Verhaal
In een project probeerde een ontwikkelaar een verwijzing naar een element van een slice door te geven, in de veronderstelling dat hij de slice veilig zou kunnen wijzigen via de pointer. Maar hij vergiste zich: de slice zelf bevat een pointer, maar na append() verandert het adres van de onderliggende array, en de wijzigingen worden niet altijd weerspiegeld in de oorspronkelijke gegevens. Dit leidde tot moeilijk te traceren bugs (gegevens "gingen verloren").
Verhaal
In een project werd een lijst van pointers naar lokale variabelen binnen een lus aangemaakt, en na het verlaten van de lus wezen alle pointers naar dezelfde variabele (de itererende lusvariabele). De fout werd pas opgemerkt na een crash in productie.
Verhaal
Een ontwikkelaar dacht ten onrechte dat het toewijzen van een pointer de vorige objecten uit het geheugen vrijgaf, en stelde de pointer expliciet in op nil, in de verwachting dat de GC onmiddellijk zou optreden. In de praktijk beslist de garbage collector in Go zelf wanneer objecten moeten worden opgeruimd, ongeacht het voortijdig nullen van verwijzingen. Dit leidde tot geheugenlekken waar men rekende op tijdige vrijgave van geheugen.