Metotlar: Struct'lara Fonksiyon Atama ve receiver Kavramı

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18

Go'da "Class" Metotları​

Daha önce Go'da class olmadığını söylemiştik. Peki nesnelere (Struct'lara) nasıl yetenek (fonksiyon) kazandıracağız? Cevap: Metotlar.

Bir fonksiyonu, özel bir Alıcı (Receiver) ile tanımladığınızda, o fonksiyon artık o tipin bir metodu olur.

Metot Tanımlama Sözdizimi​

Normal fonksiyondan tek farkı, func kelimesi ile fonksiyon ismi arasına parantez içinde alıcı tipini yazmaktır.

Kod:
package main

import "fmt"

type Dikdortgen struct {Genislik, Yukseklik int}

// "Dikdortgen" tipine "Alan" adında bir metot ekliyoruz.// (d Dikdortgen) kısmı RECEIVER'dır.func (d Dikdortgen) Alan() int {return d.Genislik * d.Yukseklik}

func main() {kutu := Dikdortgen{10, 5}

// Artık nokta (.) ile metoda erişebiliriz<br>sonuc := kutu.Alan()<br><br>fmt.Println("Alan:", sonuc)<br>
}

Kritik Ayrım: Value vs. Pointer Receiver​

Bir metot struct'ın verilerini değiştirecekse, alıcıyı mutlaka Pointer olarak tanımlamalısınız.

Kod:
type Oyuncu struct {Puan int}

// Bu metot orijinal puanı DEĞİŞTİREMEZ (Kopyasını alır)func (o Oyuncu) PuanEkleYanlis(miktar int) {o.Puan += miktar}

// Bu metot orijinal puanı DEĞİŞTİRİR (Adresini alır)// Receiver kısmındaki yıldız (*) işaretine dikkat!func (o *Oyuncu) PuanEkleDogru(miktar int) {o.Puan += miktar}

func main() {p1 := Oyuncu{Puan: 0}

p1.PuanEkleYanlis(10)<br>fmt.Println(p1.Puan) // Çıktı: 0 (Hala aynı)<br><br>p1.PuanEkleDogru(10)<br>fmt.Println(p1.Puan) // Çıktı: 10 (Değişti)<br>
}

Sonuç​

Metotlar kodunuzu daha organize ve okunabilir kılar. Struct'ın verisini değiştirmesi gerekmese bile, struct büyükse performans için genellikle Pointer Receiver tercih edilir.
 
Geri
Üst