İşaretçiler ve İşlevler
Değere göre ve işaretçiye göre geçirme
İşaretçiler ve İşlevler, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 2. 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.
Değerle Aktarma
Go, tüm işlev bağımsız değişkenlerini değerle aktarır; bir kopya oluşturulur. İşlev içinde yapılan değişiklikler özgün değeri etkilemez:
package main
import "fmt"
func increment(n int) { n++ }
func main() {
x := 5
increment(x)
fmt.Println(x) // 5 — unchanged
}İşaretçiyle Geçirme
İşlevin asıl değişkeni değiştirebilmesi için bir işaretçi geçirin:
package main
import "fmt"
func increment(n *int) { *n++ }
func main() {
x := 5
increment(&x)
fmt.Println(x) // 6
}İşaretçi Döndürme
İşlevler, öbekte ayrılmış değerlere işaretçiler döndürebilir. Go'nun kaçış analizi güvenliği sağlar:
package main
import "fmt"
func newInt(v int) *int { return &v }
func main() {
p := newInt(42)
fmt.Println(*p) // 42
}Büyük Yapılarda Verimlilik
Büyük bir yapıyı işaretçiyle geçirmek, maliyetli bir kopyalamayı önler:
package main
import "fmt"
type BigData struct{ Data [1024]int }
func process(d *BigData) { d.Data[0] = 99 }
func main() {
bd := BigData{}
process(&bd)
fmt.Println(bd.Data[0]) // 99
}Arayüze İşaretçi
Nadiren gerekir — arayüzler zaten dahili olarak bir işaretçi içerir. *interface{} geçirmek neredeyse her zaman yanlıştır:
package main
import "fmt"
type Stringer interface{ String() string }
func print(s Stringer) { fmt.Println(s.String()) }
// Pass interface directly, NOT *Stringer
type Name string
func (n Name) String() string { return string(n) }
func main() {
print(Name("Alice"))
}İşaretçilerle İsteğe Bağlı Parametreler
"Sağlanmadı" durumunu sıfır değerinden ayırt etmek için işaretçi parametreleri kullanın:
package main
import "fmt"
func greet(name *string) {
if name == nil {
fmt.Println("Hello, stranger")
return
}
fmt.Println("Hello,", *name)
}
func main() {
s := "Alice"
greet(&s)
greet(nil)
}Dilimler Üzerinden Değiştirme
Dilimler zaten dahili bir işaretçi içerir; bu nedenle çoğu zaman *[]T kullanmanız gerekmez. Ancak append yeniden ayırma yaptığında dilimin kendisine işaretçi vermeniz gerekir:
package main
import "fmt"
func addItem(s *[]int, v int) { *s = append(*s, v) }
func main() {
nums := []int{1, 2, 3}
addItem(&nums, 4)
fmt.Println(nums) // [1 2 3 4]
}İşaretçi Takma Adlandırması
Aynı değişkene işaret eden birden çok işaretçi takma adlandırma oluşturur — bir işaretçi üzerinden yapılan değişiklik diğerlerinin tümü üzerinden görünür:
package main
import "fmt"
func main() {
x := 10
a, b := &x, &x
*a = 99
fmt.Println(*b) // 99 — same memory
}İşaretçilerin Aşırı Kullanımından Kaçınma
İşaretçileri yalnızca gerektiğinde kullanın:
- İşlev içinde değiştirme
- Büyük yapılar (>= ~64 bayt)
- Yokluğu belirtmek için nil
İşaretçilerin aşırı kullanımı çöp toplayıcı üzerindeki yükü artırır ve kodun anlaşılabilirliğini azaltır.
İşlev İşaretçisi Örüntüsü
Dağıtım tabloları için işlev işaretçilerini bir eşlemede saklayın:
package main
import "fmt"
func add(a, b int) int { return a + b }
func sub(a, b int) int { return a - b }
func main() {
ops := map[string]func(int,int)int{
"+": add, "-": sub,
}
fmt.Println(ops["+"](10, 3)) // 13
fmt.Println(ops["-"](10, 3)) // 7
}Kısa Denetim
İşlevin, çağıran tarafta tanımlanan bir tamsayı değişkenini değiştirmesini nasıl sağlarsınız?
Özet
Önemli çıkarımlar:
- Go'da parametreler değer olarak geçirilir — değiştirme için işaretçi kullanın
- Öbekte ayırma yapmak için oluşturuculardan işaretçi döndürün
- Dilimler dahili bir işaretçi taşır, ancak
appendiçin*[]Tgerekebilir - İşaretçileri aşırı kullanmaktan kaçının — küçük türler için değerleri tercih edin
Alıştırma İstemi
*[]string alan ve strings.ToLower kullanarak tüm dizeleri yerinde küçük harfe dönüştüren bir normalize işlevi yazın.
Sıkça Sorulan Sorular
“İşaretçiler ve İşlevler” dersi ücretsiz mi?
Evet — “İşaretçiler ve İşlevler” 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.
“İşaretçiler ve İşlevler” dersinde ne öğreneceğim?
Değere göre ve işaretçiye göre geçirme 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 2. dersidir.
“İşaretçiler ve İşlevler” 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