Go'da İşaretçi Temelleri
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 19 / 107.
İşaretçi, başka bir değişkenin bellek adresini depolayan bir değişkendir. Doğrudan bir değer tutmak yerine, bu değerin bellekte bulunduğu konumu tutar. İşaretçiler Go için temeldir ve verileri verimli bir şekilde işlemek için gereklidir.
Bir işaretçi oluşturmak için bir değişkenin adresini almak üzere & operatörünü, bir işaretçi türü bildirmek veya o adresteki değere erişmek için ise * operatörünü kullanın.
x := 42
p := &x // p, x'in bellek adresini tutar
fmt.Println(p) // 0xc000018030 (bellek adresi)
fmt.Println(*p) // 42 (o adresteki değer)& operatörü “adresi” anlamına gelir ve bir işaretçi döndürür. Bir işaretçi üzerinde kullanıldığında * operatörü “değeri” anlamına gelir ve buna başvuruyu kaldırma denir. İşaretçi aracılığıyla özgün değeri de değiştirebilirsin.
x := 10
p := &x
*p = 25 // işaretçi aracılığıyla değeri değiştir
fmt.Println(x) // 25 (orijinal değişken değişti)İşaretçi türü, T işaret edilen tür olmak üzere *T şeklinde yazılır. Bir int işaretçisi *int türündedir.
var p *int // int için bir işaretçi bildirir
x := 100
p = &x // p artık x'e işaret ediyorBir işaretçinin sıfır değeri nil’dir; bu, hiçbir şeyi göstermediği anlamına gelir. Nil bir işaretçinin başvurusunu kaldırmaya çalışmak çalışma zamanında paniğe neden olur; bu nedenle işaretçileri kullanmadan önce her zaman başlatıldıklarından emin ol.
Görev
KolayDeğişkenleri bellek adresleri üzerinden değiştirmek için işaretçilerin gücünü gösteren basit bir değer değiştirici oluşturalım.
Kodunu iki dosyaya ayıracaksın:
swap.go: Parametre olarak ikiSwapValuesişaretçisi alan*intadlı bir fonksiyon oluştur. Bu fonksiyon, işaretçilerin gösterdiği değerleri değiştirmelidir; fonksiyon çağrıldıktan sonra her değişken diğerinin ilk değerini taşımalıdır. Fonksiyon herhangi bir şey döndürmez; değerleri doğrudan işaretçiler üzerinden değiştirir.main.go: Girdiden iki tam sayı oku, bunları değişkenlerde sakla, ardından değerlerini değiştirmek içinSwapValuesfonksiyonunu kullan. Değişimi göstermek için her iki değeri de değişimden önce ve sonra yazdır.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Birinci tam sayı
- 2. satır: İkinci tam sayı
Çıktı biçimi:
Before: a=[first] b=[second]
After: a=[first] b=[second]Örneğin, 10 ve 25 verildiğinde çıktın şu şekilde olmalıdır:
Before: a=10 b=25
After: a=25 b=10Değişkenlerini fonksiyona aktarırken & operatörünü, gerçek değerlere erişmek ve onları değiştirmek için fonksiyonun içinde * operatörünü kullanmayı unutma.
Kendin dene
package main
import "fmt"
func main() {
// Girişten iki tamsayı oku
var a, b int
fmt.Scanln(&a)
fmt.Scanln(&b)
// Takastan önce değerleri yazdır
fmt.Printf("Before: a=%d b=%d\n", a, b)
// TODO: a ve b'ye işaretçilerle SwapValues fonksiyonunu çağır
// Adresleri geçmek için & operatörünü kullanmayı unutma
// Takastan sonra değerleri yazdır
fmt.Printf("After: a=%d b=%d\n", a, b)
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker PoolKendi başına pratik yap: Online Go derleyicisi