Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

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