Bu örnekte sonsuz döngüden çıkacağız ve tüm süreci sonlandırmak yerine, döngü dışında kalan bir sonraki adımlara geçeceğiz.


Uygulama


Bu uygulama sonsuza kadar çalışır ve fmt.Println("main: end") satırına hiçbir zaman gelmez. Eğer fmt.Println("timeout") satırından sonra os.Exit(0) kullanırsanız, uygulama anında kesilecektir.


package main

import (
"fmt"
"time"
)

func main() {
fmt.Println("main: start")

for {
select {
case <-time.After(2 * time.Second):
fmt.Println("timeout")
}
}

fmt.Println("main: end")
}

main: start
timeout
timeout
timeout
timeout
...
...

Çözüm 1


Bu, etiketlere (Labels) dayanan ve de tercih edilen çözümdür.


package main

import (
"fmt"
"time"
)

func main() {
fmt.Println("main: start")

Loop:
for {
select {
case <-time.After(2 * time.Second):
fmt.Println("timeout")
break Loop
}
}

fmt.Println("main: end")
}

main: start
timeout
main: end

Çözüm 2


Bu anonim bir fonksiyon kullanır.


package main

import (
"fmt"
"time"
)

func main() {
fmt.Println("main: start")

func() {
for {
select {
case <-time.After(2 * time.Second):
fmt.Println("timeout")
return
}
}
}()

fmt.Println("main: end")
}

main: start
timeout
main: end