CodeBlanks Logo Icon CodeBlanks

runtime.Goexit

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

main.go
package main

import (
    "fmt"
    "runtime"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
defer wg.Done()
if hata {
    runtime.____()
}
Cevap
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üş

Uzman bölümündeki tüm dersler