Yöntemlerde İşaretçi Alıcıları
Yapı durumunu işaretçi alıcıları aracılığıyla değiştirme
Yöntemlerde İşaretçi Alıcıları, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.
Özet: Değer ve İşaretçi Alıcısı
Değer alıcısı, yapının bir kopyası üzerinde çalışır. İşaretçi alıcısı, asıl yapı üzerinde çalışır. Bir yöntemin durumu değiştirmesi gerektiğinde işaretçi alıcılarını kullanın.
İşaretçi Alıcısıyla Değiştirme
Yalnızca işaretçi alıcısı yapıyı değiştirebilir:
package main
import "fmt"
type Stack struct{ items []int }
func (s *Stack) Push(v int) { s.items = append(s.items, v) }
func (s *Stack) Pop() int {
n := len(s.items) - 1
v := s.items[n]
s.items = s.items[:n]
return v
}
func main() {
var st Stack
st.Push(1); st.Push(2)
fmt.Println(st.Pop()) // 2
}Tutarlılık Kuralı
Bir türdeki herhangi bir yöntem işaretçi alıcısına ihtiyaç duyuyorsa tüm yöntemler işaretçi alıcılarını kullanmalıdır. Karıştırmak, arayüz uyumluluğunda sorunlara yol açar:
package main
import "fmt"
type Counter struct{ n int }
func (c *Counter) Inc() { c.n++ } // pointer
func (c *Counter) Val() int { return c.n } // pointer too
func main() {
c := &Counter{}
c.Inc(); c.Inc()
fmt.Println(c.Val()) // 2
}Arayüz Uyumluluğu
İşaretçi alıcısı yöntemi, T değil yalnızca *T türünün yöntem kümesindedir. Bu durum arayüz uyumluluğunu etkiler:
package main
import "fmt"
type Writer interface{ Write([]byte) }
type File struct{ name string }
func (f *File) Write(b []byte) { fmt.Println(string(b)) }
func main() {
var w Writer = &File{"out.txt"} // OK
// var w Writer = File{} — compile error
w.Write([]byte("hello"))
}Adresin Otomatik Alınması
Go, adreslenebilir bir değer üzerinde işaretçi alıcısı yöntemini çağırırken adresi otomatik olarak alır:
package main
import "fmt"
type Box struct{ V int }
func (b *Box) Double() { b.V *= 2 }
func main() {
b := Box{5}
b.Double() // Go does (&b).Double()
fmt.Println(b.V) // 10
}Adreslenemeyen Değerler
Adreslenemeyen değerler üzerinde işaretçi alıcısı yöntemlerini çağıramazsınız (eşleme öğeleri ve değişkenlere atanmamış işlev dönüş değerleri):
package main
type T struct{ V int }
func (t *T) Set(v int) { t.V = v }
func getT() T { return T{} }
func main() {
var t T
t.Set(1) // OK — t is addressable
// getT().Set(1) — ERROR: cannot take address of getT()
_ = t
}Büyük Yapı Alıcıları
Her yöntem çağrısında maliyetli kopyalamaları önlemek için büyük yapılarda her zaman işaretçi alıcılarını kullanın:
package main
type Image struct{ pixels [1024][1024]uint8 }
// Value receiver copies 1MB per call!
func (img Image) Bad() uint8 { return img.pixels[0][0] }
// Pointer receiver — zero copy
func (img *Image) Good() uint8 { return img.pixels[0][0] }
func main() { _ = Image{} }Nil İşaretçi Alıcıları
İşaretçi alıcılarına sahip yöntemler nil durumunu zarif bir şekilde ele alabilir:
package main
import "fmt"
type List struct{ head *node }
type node struct{ val int; next *node }
func (l *List) Len() int {
if l == nil { return 0 }
count := 0
for n := l.head; n != nil; n = n.next { count++ }
return count
}
func main() {
var l *List
fmt.Println(l.Len()) // 0
}İçerme ve İşaretçi Alıcıları
İşaretçi alıcılarına sahip bir tür içe alındığında, terfi ettirilen yöntemlere erişmek için dış yapı da işaretçi olarak kullanılmalıdır:
package main
import "fmt"
type Base struct{ V int }
func (b *Base) Set(v int) { b.V = v }
type Derived struct{ Base }
func main() {
d := &Derived{}
d.Set(42) // promoted pointer-receiver method
fmt.Println(d.V) // 42
}Karşılıklı Dışlama Kilitlerini Kopyalama
sync.Mutex içeren bir yapıyı asla kopyalamayın — her zaman işaretçi alıcısı kullanın veya işaretçiyle geçirin. Kilitli bir karşılıklı dışlama kilidini kopyalamak kilitlenmeye neden olur:
package main
import "sync"
type Safe struct {
mu sync.Mutex
v int
}
// Correct: pointer receiver
func (s *Safe) Set(v int) {
s.mu.Lock()
defer s.mu.Unlock()
s.v = v
}
func main() { _ = Safe{} }go vet Hataları Saptar
Kilitleri ve karşılıklı dışlama kilitlerini kopyalamak gibi yaygın işaretçi alıcısı hatalarını yakalamak için go vet ./... komutunu çalıştırın. Bu komut, go build işlem hatlarının ve CI denetimlerinin bir parçasıdır.
Kısa Denetim
İşaretçi alıcısı yöntemi hangi türlerin yöntem kümesinde bulunur?
Özet
Önemli çıkarımlar:
- İşaretçi alıcıları değişiklik yapar; değer alıcıları yapmaz
- Bir türdeki tüm yöntemlerde aynı alıcı türünü kullanın
- Yalnızca
*T, işaretçi alıcısı yöntemleri gerektiren arayüzlerle uyumludur - Karşılıklı dışlama kilitleri içeren yapıları asla kopyalamayın — işaretçi alıcıları kullanın
Alıştırma İstemi
[]int dilimiyle desteklenen bir Queue yapısı ve işaretçi alıcısına sahip Enqueue(int), Dequeue() (int, bool) ve Len() int yöntemlerini uygulayın.
Sıkça Sorulan Sorular
“Yöntemlerde İşaretçi Alıcıları” dersi ücretsiz mi?
Evet — “Yöntemlerde İşaretçi Alıcıları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.
“Yöntemlerde İşaretçi Alıcıları” dersinde ne öğreneceğim?
Yapı durumunu işaretçi alıcıları aracılığıyla değiştirme Go Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Go Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Go Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Yöntemlerde İşaretçi Alıcıları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Go Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Go Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- İşaretçiler Nedir?
- İşaretçiler ve İşlevler
- Yöntemlerde İşaretçi Alıcıları
- new() ve İşaretçilerin Kullanılacağı Durumlar