CodeBlanks Logo Icon CodeBlanks

Pointer ve fonksiyon

Fonksiyona pointer geçirmeyi ve değişikliği öğrenirsin.

Pointer ve fonksiyon

Go her argümanı kopyalar. Fonksiyonun çağıranın değişkenini değiştirmesi için adres verilir:

func ikiKat(n *int) {
    *n *= 2
}

x := 5
ikiKat(&x)
fmt.Println(x)  // 10

Fonksiyon imzasında *int görmek, "bu fonksiyon değeri değiştirebilir" anlamına gelir; okuyana önemli bir ipucudur.

Değer mi işaretçi mi döndürmek?

Çoğu durumda yeni değeri döndürmek daha okunurdur: x = ikiKat(x). İşaretçi parametresi, bir struct'ın birçok alanını yerinde güncellerken ya da birden çok çıktıyı doldururken anlamlıdır. fmt.Sscan(&a, &b) ve json.Unmarshal(veri, &v) işaretçi alan standart fonksiyonlara örnektir.

Uygulama Yer değiştir

degistir(a, b *int) fonksiyonunu yaz. x, y := 1, 2 için degistir(&x, &y) çağır ve x ile y'yi yazdır.

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import "fmt"

func degistir(a, b *int) {
    *a, *b = *b, *a
}

func main() {
    x, y := 1, 2
    degistir(&x, &y)
    fmt.Println(x, y)
}

Beklenen çıktı

2 1

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 İki değişkenin değerini yer değiştiren fonksiyonun imzası hangisi olmalıdır?

  • func degistir(a int, b *int)
  • func degistir() (int, int)
  • func degistir(a, b *int) Doğru cevap
  • func degistir(a, b int)

Açıklama: İki değişkeni de değiştirmek için ikisinin adresi gerekir; içeride *a, *b = *b, *a yazılır.

2 Adresi geçir

Soru
x := 5
ikiKat(____x)
fmt.Println(x)  // 10
Cevap
x := 5
ikiKat(&x)
fmt.Println(x)  // 10

Açıklama: Fonksiyon *int beklediği için x'in adresi &x ile verilir.

3 İmza ve anlamı

Kavram Anlamı
func f(n int) Kopya alır
func f(n *int) Değiştirebilir
f(&x) Adres verilir
json.Unmarshal(b, &v) Hedefi doldurur

Başlangıç bölümündeki tüm dersler