Yapılar Üzerinde Yöntemler
Değer alıcıları ve işaretçi alıcıları karşılaştırması
Yapılar Üzerinde Yöntemler, 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.
Yöntem Nedir
Yöntem, alıcı bağımsız değişkenine sahip bir işlevdir. Alıcı, func anahtar sözcüğü ile yöntem adı arasında yer alır ve işlevi bir türe bağlar.
Değer Alıcısı
Değer alıcısı yapının bir kopyasını alır. Yöntemin durumu değiştirmesi gerekmiyorsa kullanınız:
package main
import "fmt"
type Circle struct{ Radius float64 }
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}
func main() {
c := Circle{Radius: 5}
fmt.Printf("%.2f\n", c.Area()) // 78.54
}İşaretçi Alıcısı
İşaretçi alıcısı, yöntemin yapıyı değiştirmesine olanak tanır. Büyük yapılar için daha verimlidir:
package main
import "fmt"
type Counter struct{ N int }
func (c *Counter) Increment() { c.N++ }
func (c *Counter) Reset() { c.N = 0 }
func main() {
c := Counter{}
c.Increment(); c.Increment()
fmt.Println(c.N) // 2
c.Reset()
fmt.Println(c.N) // 0
}İşaretçi Alıcıları Ne Zaman Kullanılmalı
İşaretçi alıcılarını şu durumlarda kullanınız:
- Yöntemin alıcıyı değiştirmesi gerektiğinde
- Yapı büyük olduğunda (kopyalama önlenir)
- Tutarlılık için: herhangi bir yöntemde işaretçi alıcısı varsa tüm yöntemlerde olmalıdır
Yapı küçük olduğunda ve yöntem yalnızca verileri okuduğunda değer alıcılarını kullanınız.
Yöntem İfadeleri ve Değerleri
Yöntemler birinci sınıf değerler olarak kullanılabilir:
package main
import "fmt"
type Adder struct{ Base int }
func (a Adder) Add(n int) int { return a.Base + n }
func main() {
a := Adder{Base: 10}
fn := a.Add // method value — bound to a
fmt.Println(fn(5)) // 15
}Yapı Olmayan Türlerde Yöntemler
Yalnızca yapılarda değil, aynı paketteki herhangi bir adlandırılmış türde yöntem tanımlayabilirsiniz:
package main
import "fmt"
type Celsius float64
func (c Celsius) ToFahrenheit() float64 {
return float64(c)*9/5 + 32
}
func main() {
t := Celsius(100)
fmt.Println(t.ToFahrenheit()) // 212
}İşaretçinin Başvurusunu Otomatik Çözümleme
Yöntemleri çağırırken Go adresi otomatik olarak alır veya işaretçinin başvurusunu çözer. (&c).Method() ifadesini elle yazmanız gerekmez:
package main
import "fmt"
type Box struct{ Val int }
func (b *Box) Double() { b.Val *= 2 }
func main() {
b := Box{Val: 5}
b.Double() // Go auto-takes address
fmt.Println(b.Val) // 10
}Yöntemleri Zincirleme
Yöntemleri zincirleyebilmek için alıcı işaretçisini döndürünüz (oluşturucu kalıbı):
package main
import "fmt"
type Builder struct{ result string }
func (b *Builder) Add(s string) *Builder {
b.result += s
return b
}
func (b *Builder) Build() string { return b.result }
func main() {
s := (&Builder{}).Add("Hello").Add(", ").Add("World").Build()
fmt.Println(s)
}Dize Yöntemi (fmt.Stringer)
Bir türün nasıl yazdırılacağını denetlemek için String() string yöntemini uygulayınız:
package main
import "fmt"
type Point struct{ X, Y int }
func (p Point) String() string {
return fmt.Sprintf("(%d, %d)", p.X, p.Y)
}
func main() {
p := Point{3, 4}
fmt.Println(p) // (3, 4)
}Boş İşaretçi Alıcıları
İşaretçi alıcısına sahip bir yöntem boş bir işaretçi üzerinde çağrılabilir; bu, varsayılan davranışlar için kullanışlıdır:
package main
import "fmt"
type Node struct{ Val int }
func (n *Node) Value() int {
if n == nil { return 0 }
return n.Val
}
func main() {
var n *Node
fmt.Println(n.Value()) // 0
}Tutarlılık İlkesi
Go'nun standart kitaplığında ve Go'nun yerleşik kullanım biçiminde, bir türdeki tüm yöntemler aynı alıcı türünü kullanır; ya tümü işaretçi ya da tümü değer alıcısıdır. Bunları karıştırmak arayüzlerde fark edilmesi zor hatalara yol açar.
Kısa Kontrol
Hangi alıcı türü bir yöntemin yapının alanlarını değiştirmesine olanak tanır?
Özet: Yöntemler
Temel çıkarımlar:
- Yöntemlerde
funcile ad arasında bir alıcı bulunur - Değer alıcıları: salt okunur kullanım ve küçük yapılar
- İşaretçi alıcıları: değiştirme, büyük yapılar ve tutarlılık
- Go, işaretçi başvurularını otomatik çözer;
(&v).Method()yazmanız gerekmez - Özel yazdırma için
String() stringuygulayınız
Alıştırma Görevi
Balance float64 alanına sahip bir BankAccount yapısı tanımlayınız. Deposit ve Withdraw işaretçi alıcılı yöntemleri ile bir String() değer alıcılı yöntemi ekleyiniz.
Sıkça Sorulan Sorular
“Yapılar Üzerinde Yöntemler” dersi ücretsiz mi?
Evet — “Yapılar Üzerinde Yöntemler” 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.
“Yapılar Üzerinde Yöntemler” dersinde ne öğreneceğim?
Değer alıcıları ve işaretçi alıcıları karşılaştırması 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.
“Yapılar Üzerinde Yöntemler” 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
- Yapı Tanımlama ve Kullanma
- Yapılar Üzerinde Yöntemler
- Yapıcı Örüntüleri
- Anonim Yapılar ve Birleştirme