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:
- Bir hayvan yaratıyoruz
cat
türünde tanımlanan niteliklere sahip olananimal
. - Şimdi güncelleme yapmak istiyorum
myAnimal
birindencat
bircow
. Bunu yapmak için alıcı işlevimi çağırıyorumcat.updateAttributes("cow", "mooooooooo")
nitelikleri güncellemek içinname
Vesound
. - 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ıyormyAnimal
.
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Ş