runtime.Goexit
- Go kursu
- Uzman
- Ders 23/34
- 4 dk
Goexit ile goroutine'i temiz şekilde bitirmeyi öğrenirsin.
runtime.Goexit
runtime.Goexit() çağıran goroutine'i sonlandırır ama önce o goroutine'deki tüm defer'leri çalıştırır. Diğer goroutine'ler etkilenmez; panic değildir, recover onu yakalamaz.
go func() {
defer fmt.Println("temizlik")
runtime.Goexit()
fmt.Println("buraya gelinmez")
}()testing.T.FailNow ve t.Fatal testi bu yöntemle durdurur.
Goexit, panic ve os.Exit
Üç farklı çıkış: runtime.Goexit yalnızca bu goroutine'i defer'leri çalıştırarak bitirir; panic defer'leri çalıştırır, yakalanmazsa tüm programı çökertir; os.Exit defer'leri çalıştırmadan süreci hemen sonlandırır. Bu yüzden main içinde defer ile kaynak kapatıyorsan os.Exit'ten kaçın ya da önce temizliği elle yap.
Uygulama Goexit ve defer
Bir goroutine'de defer close(bitti) ve defer fmt.Println("temizlik") yaz, ardından runtime.Goexit() çağır. main <-bitti ile beklesin ve "main bitti" yazdırsın.
Başlangıç kodu
package main
import (
"fmt"
"runtime"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"runtime"
)
func main() {
bitti := make(chan struct{})
go func() {
defer close(bitti)
defer fmt.Println("temizlik")
runtime.Goexit()
}()
<-bitti
fmt.Println("main bitti")
}Beklenen çıktı
temizlik main bitti
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>main</code> goroutine'inde Goexit çağrılırsa ve başka goroutine yoksa ne olur?
- Hiçbir şey olmaz
- Program kilitlenme (deadlock) hatasıyla çöker Doğru cevap
- Program normal biter
- main yeniden başlar
Açıklama: Goexit main'i bitirir ama os.Exit gibi programı kapatmaz; çalışacak goroutine kalmayınca çalışma zamanı deadlock bildirir.
2 Goroutine'i bitir
defer wg.Done()
if hata {
runtime.____()
}
defer wg.Done()
if hata {
runtime.Goexit()
}
Açıklama: Goexit defer'leri çalıştırarak goroutine'i sonlandırır; wg.Done yine çağrılır.
3 Çıkış yolu
| Kavram | Anlamı |
|---|---|
runtime.Goexit |
Bu goroutine, defer'ler çalışır |
panic |
Defer'ler çalışır, program çöker |
os.Exit |
Defer'ler çalışmaz |
return |
Normal dönüş |