MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

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.