Pointer ve fonksiyon
- Go kursu
- Başlangıç
- Ders 66/90
- 4 dk
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) // 10Fonksiyon 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
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
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
x := 5
ikiKat(____x)
fmt.Println(x) // 10
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 |