Goroutine ve fonksiyon
- Go kursu
- Orta seviye
- Ders 3/80
- 4 dk
Fonksiyonu goroutine olarak çağırmayı öğrenirsin.
Goroutine ve fonksiyon
Herhangi bir func'ı goroutine olarak çağırabilirsin. go greet("Ayşe") greet fonksiyonunu arka planda başlatır. Fonksiyon imzası aynı kalır; yalnızca çağrı şekli değişir.
Parametreler çağrı anında kopyalanır ve goroutine'e iletilir. Bu yüzden döngüde go f(i) yazmak güvenlidir: her goroutine kendi i değerini alır.
Fakat fonksiyon değer döndürüyorsa bu değeri goroutine'den alamazsın. Sonucu channel'a göndermek veya shared state yazmak gerekir.
Döngüde goroutine
Bir döngüde birden çok goroutine başlatmak yaygındır: for i := 0; i < 3; i++ { go f(i) }. Her yinelemede yeni bir goroutine başlar ve kendi i kopyasını alır.
Go 1.22'den önce döngü değişkeni paylaşıldığı için tüm goroutine'ler aynı (son) değeri görürdü. Go 1.22+ bu davranışı düzeltti: her yineleme ayrı bir değişken oluşturur.
Yine de senkronizasyon gerekir: ana program goroutine'ler bitmeden çıkarsa çıktı kaybolur. sync.WaitGroup veya channel ile bekleme yapılır.
Uygulama Fonksiyonu goroutine çağır
main içine bir go greet() çağrısı ve fmt.Println ile fonksiyon çağrıldı yazdır.
Başlangıç kodu
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
import "fmt"
func greet() {
fmt.Println("fonksiyon çağrıldı")
}
func main() {
go greet()
fmt.Println("fonksiyon çağrıldı")
}Beklenen çıktı
fonksiyon çağrıldı
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 go f(i) çağrısında i nasıl iletilir?
- Değer olarak kopyalanır Doğru cevap
- Channel ile
- Referans olarak
- Pointer olarak
Açıklama: değer olarak kopyalanır. Referans veya pointer açıkça belirtilmeli.
2 Döngüde goroutine çağrısı
for i := 0; i < 3; i++ {
____ f(i)
}
for i := 0; i < 3; i++ {
go f(i)
}
Açıklama: for döngü, go goroutine başlatır.
3 Fonksiyon-goroutine eşleştir
| Kavram | Anlamı |
|---|---|
go f(i) |
Döngüde goroutine |
parametre |
Kopyalanır |
dönüş |
Doğrudan alınamaz |
WaitGroup |
Bekleme |