make-gofer-2

pointer kavramı

Go dilinde işaretçiler (“pointer”) İşaretçi değişkenin bellekteki adresini tutar.

*T, T değerini gösteren bir türdür. Sıfır değeri olarak nil kullanılır.

var p *int

& operatörü başına geldiği terimi gösteren bir gösterici oluşturur.

i := 42
p = &i

* operatörü, göstericinin gösterdiği değişkenin değerini gösterir.

fmt.Println(*p) // p göstericisi üzerinden i'nin değerini oku
*p = 21 // p göstericisi üzerinden i'ye değer ata

Buna dolaylı yoldan erişim denir.

C dilinin aksine, Go dilinde gösterici aritmetiği desteklenmez.

package main

import "fmt"

func main(){
i :=21
p:=&i
fmt.Println("inin adrsindeki değeri verir",*p)// inin adrsindeki değeri verir
*p =99 // inin değerini değiştirir
fmt.Println(i)
j:=33
p=&j
*p=*p/3
fmt.Println(j) // dolaylı yoldan j nin değerini değiştik 11


}
Değişkenin hafızada durduğu yeri refarans eden dir Pointer i := 5 ifadesinde, i’in değeri olan 5 yerine, i’in hafızada rezerve ettiği / durduğu yeri gösterir pointer.
Not:Argüman alan bir fonksiyon çağırdığımızda, argüman, fonksiyona kopyalanır:
package main

import "fmt"

func bir(x int){
x=1
}
func iki(x *int){
*x=2
}
func main(){
x:=0
bir(x)
fmt.Println(x) // x halen 0

iki(&x)
fmt.Println(x) // değişti 2 oldu
}
iki’ye değişkenin pointer’ı yani hafızadaki adresi geçiliyor. Yaptığımız iş ilgili adresin içini değiştirmek.

farklı olarak pointeri lamak istersek, new ile yeterli hafıza adresini tutmak için tipi alır ve değere yetecek kadarlık yerin adresini geri döner

c:=new(int)
iki(c)
fmt.Println(*c) // 2