Pointere și funcții
Pointere ca parametri ai funcției
Implicit, toate parameterele sunt transmise funcției prin valoare. De exemplu:
package main
import "fmt"
func changeValue(x int){
x = x * x
}
func main() {
d := 5
fmt.Println("d before:", d) // 5
changeValue(d) // modificăm valoarea
fmt.Println("d after:", d) // 5 - valoarea nu s-a schimbat
}
Funcția changeValue modifică valoarea parametrului, ridicându-l la pătrat. Dar după apelarea acestei funcții vedem că valoarea variabilei d, care este transmisă la changeValue, nu s-a schimbat. Aceasta deoarece funcția primește o copie a variabilei respective și lucrează cu aceasta independent de variabila originală d. Prin urmare, d nu se schimbă.
Totuși, ce se întâmplă dacă trebuie să modificăm valoarea variabilei transmise? În acest caz, putem folosi pointere:
package main
import "fmt"
func changeValue(x *int){
*x = (*x) * (*x)
}
func main() {
d := 5
fmt.Println("d before:", d) // 5
changeValue(&d) // modificăm valoarea
fmt.Println("d after:", d) // 25 - valoarea s-a schimbat!
}
Acum, funcția changeValue primește un pointer către un obiect de tip int. La apelarea funcției changeValue, i se transmite adresa variabilei d (changeValue(&d)). După executarea acesteia, vedem că valoarea variabilei d s-a schimbat.
Pointer ca rezultat al funcției
O funcție poate returna un pointer:
package main
import "fmt"
func createPointer(x int) *int{
p := new(int)
*p = x
return p
}
func main() {
p1 := createPointer(7)
fmt.Println("p1:", *p1) // p1: 7
p2 := createPointer(10)
fmt.Println("p2:", *p2) // p2: 10
p3 := createPointer(28)
fmt.Println("p3:", *p3) // p3: 28
}
În acest caz, funcția createPointer returnează un pointer către un obiect de tip int.