"Eat"
、"Work"
、"Sleep"
をそれぞれ3番目、8番目、24番目の秒ごとに出力するプログラムを作成しようとしています。ここに私のコードは次のとおりです。Golang:select文が終了しないときに終了する
package main
import (
"fmt"
"time"
)
func Remind(text string, delay time.Duration) <-chan string { //channel only for receiving strings
ch := make(chan string) // buffered/unbuffered?
go func() {
for {
msg := "The time is " + time.Now().Format("2006-01-02 15:04:05 ") + text
ch <- msg
time.Sleep(delay) // waits according to specification
}
}()
return ch
}
func main() {
ch1 := Remind("Eat", 1000*1000*1000*3) // every third second
ch2 := Remind("Work", 1000*1000*1000*8) // every eighth second
ch3 := Remind("Sleep", 1000*1000*1000*24) // every 24th second
select { // chooses one channel that is not empty. Should run forever (?)
case rem1 := <-ch1:
fmt.Println(rem1)
case rem2 := <-ch2:
fmt.Println(rem2)
case rem3 := <-ch3:
fmt.Println(rem3)
}
}
それに伴う問題は、それが"Eat"
が続く時間を印刷した後、すぐに実行を停止していることです。私が読んだ他の例では、select
の声明は永遠に続きます。なぜそれは今ではないのですか?
は、何かを誤解している必要があります。ありがとう! – Sahand
@Sandiほとんどの場合、 'select'は、通信操作が必要であれば永遠に進むことができないかどうかを待つでしょう。しかしそれは繰り返されません。 – icza
例えば、すべてのチャンネルが空であれば、 'select'は待機しますか? – Sahand