A işaretçiAdından da anlaşılacağı gibi, sisteminizin belleğinde bir değerin kendisinden ziyade bir değerin depolandığı bir konuma işaret eden bir değişkendir. Temel olarak hafızada saklanan değere bir adrestir. Tanımı basittir ancak bu kavramın anlaşılması biraz zor olabilir.

Go’da işaretçiler konusunda ilk kez iyi bir anlayış geliştirdiğimde kendime şu soruyu sordum: “Bu kavramı 5 yaşındaki bir çocuğa nasıl açıklayabilirim?” Bunu 5 yaşındaki bir çocuğa açıklayacak kelimeleri bulabilir miyim bilmiyorum ama yine de size basit ve kapsamlı bir anlayış sunmaya çalışacağım.

Küçük bir kod parçası yazalım:

package main

import "fmt"

type animal struct {
name string
sound string
}

func main() {
myAnimal := animal{
name: "Cat",
sound: "Meeeaaawwwwww",
}

myAnimal.updateAttributes("Cow", "Mooooooooo")

myAnimal.print("Updated Structure")
}

func (p animal) updateAttributes(newName string, sound string) {
p.name = newName
p.sound = sound
}

func (p animal) print(text string) {
result := fmt.Sprintf("%s ==> %+v \n \n", text, p)
fmt.Printf("%+v", result)
}

Bunu parçalara ayıralım:

  1. Bir hayvan yaratıyoruz cat türünde tanımlanan niteliklere sahip olan animal .
  2. Şimdi güncelleme yapmak istiyorum myAnimal birinden cat bir cow. Bunu yapmak için alıcı işlevimi çağırıyorum cat.updateAttributes("cow", "mooooooooo") nitelikleri güncellemek için name Ve sound .
  3. Sonunda başka bir alıcı fonksiyonunu çağırdım print güncellenen hayvanımı yazdırmak için.

Go modülümüzü kullanarak çalıştıralım. go run .:

//Output:

Updated Structure ==> {
name:Cat 
sound:Meeeaaawwwwww 
zooInfo:{
town:California 
email:abc@xyz.com 
pinCode:12345
  }
}

Wooops… gördüğünüz gibi, hayvanım hala bir cat.

Alıcı fonksiyonunun içinde nelerin basıldığını görelim:

func (p animal) updateAttributes(newName string, sound string) {
p.name = newName
p.sound = sound


p.print("Tadaaa")
}


Tadaaaa ==> {
name:cow 
sound:Mooooooooo 
}

Arka planda olanlar şöyle:

Özetle, Go tamamen yeni bir struct ne zaman myAnimal bir fonksiyondan diğerine aktarılır ve p alıcı işlevi argümanı yeni bir hale gelir struct tamamen.

Başka bir deyişle, p değeri farklı bir hafıza konumunda saklanıyor myAnimal .

Orijinalde değişiklik yapmak için struct kullanabiliriz * Ve & operatörler.

‘*’ ve ‘&’ operatörü

Ana fonksiyonumuzu ve alıcı fonksiyonumuz updateAttributes’u biraz değiştirelim:

func main() {
myAnimal := animal{
name: "Cat",
sound: "Meeeaaawwwwww",
}


myAnimal.print("Original Structure")


myAnimalPointer := &myAnimal




myAnimalPointer.updateAttributes("Dog", "Woof Woof Woof")



myAnimal.print("Updated Struct")
}



func (p *animal) updateAttributes(newName string, sound string) {
(*p).name = newName
(*p).sound = sound
}

Gelelim “ana” fonksiyona: Pointer oluşturma

myAnimal := animal{
name: "Cat",
sound: "Meeeaaawwwwww"
}

myAnimalPointer := &myAnimal
myAnimalPointer.updateAttributes("Dog", "Woof Woof Woof")

//OR We can simply do something like 
(&myAnimal).updateAttributes("Dog", "Woof Woof Woof") //Same thing!

myAnimal.print("Updated Struct")
}

kullanarak &operatörü ile bir pointer oluşturabiliriz ve hafızadaki değerin bulunduğu adresi alabiliriz. myAnimal saklanır. biz görevlendirdik &myAnimal işaretçi myAnimalPointer değişken.

Biraz da “updateAttributes” alıcı fonksiyonundan bahsedelim: İşaretçiden değer alma

func (p *animal) updateAttributes(newName string, sound string) {
(*p).name = newName
(*p).sound = sound
}

p işlevin çağrıldığında aldığı işaretçidir.

*animal bir işaretçi değil, bu işlevin çağrıldığında ne beklediğinin yalnızca bir açıklamasıdır.

İşaretçinin hafızadaki değeri p referanslara, kullanılarak erişilebilir. * operatör.

Parantez kullanarak, (*p)size aşağıdakilere erişmenizi sağlayacaktır: struct nitelikler.

Kodu tekrar çalıştıralım:

go run .


Original Structure ==> {name:Cat sound:Meeeaaawwwwww}

Updated Struct ==> {name:Dog sound:Woof Woof Woof}

Woohooo ?… orijinal myAnimal yapısını işaretçilerin gücüyle güncelledik.

Yakalanmış bir an…

“abrakadabra” kodu görünsün…

func main() {
myAnimal := animal{
name: "Cat",
sound: "Meeeaaawwwwww",
}
myAnimal.print("Original Structure")







myAnimal.updateAttributes("Dog", "Woof Woof Woof")

myAnimal.print("Updated Struct")
}

func (p *animal) updateAttributes(newName string, sound string) {
(*p).name = newName
(*p).sound = sound
}

Go, arka planda işaretçi oluşturma işlemini otomatik olarak gerçekleştirir, böylece sizin bunu yapmanıza gerek kalmaz. Ve bu şekilde aynı sonucu elde edeceksiniz:

go run .

Original Structure ==> {name:Cat sound:Meeeaaawwwwww}

Updated Struct ==> {name:Dog sound:Woof Woof Woof}


Yeni Anahtar Kelime

kullanarak bir işaretçi oluşturalım. new anahtar kelime:

package main

import "fmt"

type animal struct {
name string
sound string
}

func (p *animal) updateAttributes(newName string, sound string) {
(*p).name = newName
(*p).sound = sound
}

func main() {


myAnimal := new(animal)
myAnimal.updateAttributes("Dog", "Woof Woof Woof")
fmt.Printf("%+v", *myAnimal)

}



{name:Dog sound:Woof Woof Woof}%

Resmi Tanım:

new türü bir argüman olarak alır, bu türden bir değere sığacak kadar yeterli bellek ayırır ve ona bir işaretçi döndürür.

Umarım sizin gibi tüm sevgili okuyucularım ve takipçilerim için bu kavramı biraz daha anlaşılır hale getirebilmişimdir. Bir şeyin geliştirilebileceğini düşünüyorsanız, lütfen yorum bırakın, ben de araştıracağım.

Güzel bir gün geçirin!

. . .

Teşekkür notu ❤️

Uğradığınız için teşekkür ederiz. Umarım bu makaleyi faydalı bulursunuz. Lütfen beni takip et Medium’da ve 1k takipçiye ulaşmama yardım et ??. Bu beni gerçekten daha fazla içerik yayınlamaya teşvik edecek.

Not: Bir şeyin geliştirilebileceğini veya uygun bir açıklamanın eksik olduğunu düşünüyorsanız, yorum kutusuna bir not bırakın veya bana e-posta gönderin. shiva.chaturvedi91@gmail.com. Sonuçta sen de bana bir iki şey öğretebilirsin.

BUNU FAYDALI MI BULDUSUNUZ? PAYLAŞ

Post a comment

Your email address will not be published.

Related Posts