Ich versuche, einen einfachen Code von Golang Routinen zu verstehen:Wie kann ich "time.After" und "default" in Golang verwenden?
package main
import (
"fmt"
"time"
)
func sleep(seconds int, endSignal chan<- bool) {
time.Sleep(time.Duration(seconds) * time.Second)
endSignal <- true
}
func main() {
endSignal := make(chan bool, 1)
go sleep(3, endSignal)
var end bool
for !end {
select {
case end = <-endSignal:
fmt.Println("The end!")
case <-time.After(5 * time.Second):
fmt.Println("There's no more time to this. Exiting!")
end = true
}
}
}
ist das in Ordnung, aber warum kann ich nicht eine einfache Standard in diesem „wählen Sie“ Block verwenden? Etwas wie folgt aus:
for !end {
select {
case end = <-endSignal:
fmt.Println("The end.")
case <-time.After(4 * time.Second):
fmt.Println("There's no more time to this. Exiting!")
end = true
default:
fmt.Println("No end signal received.")
}
}
Es wird diese Ausgabe:
❯ go run goroutines-timeout.go
No end signal received!
No end signal received!
No end signal received!
No end signal received!
...
The end!
Und ich, warum nicht verstehen kann.
Diese jede Iteration überprüft ist, was 'default 'tut. Kannst du erklären, was du erwartet hast? – JimB
Ich erwarte, dass "default" dies tut, während die "time.After" Zeit nicht endet. –
Ich verstehe nicht, das ist was es tut. Der Fall 'time.After' wird nicht ausgeführt, da der Standardfall verwendet wird. – JimB