間に合わなかった場合
package main
import (
"context"
"fmt"
"time"
)
func task(ctx context.Context, channel_kun chan string) {
fmt.Println("start")
time.Sleep(5 * time.Second)
fmt.Println("finish")
channel_kun <- "良くできました"
}
func main() {
channel_kun := make(chan string)
ctx := context.Background()
time_limit := 3 * time.Second
fmt.Println("制限時間は", time_limit, "ね~")
ctx, cancel := context.WithTimeout(ctx, time_limit)
defer cancel()
go task(ctx, channel_kun)
loop_label:
for {
select {
case <-ctx.Done():
fmt.Println("時間切れ~")
fmt.Println(ctx.Err())
break loop_label
// タスクが間に合った時。
case message := <-channel_kun:
fmt.Println("間に合いました")
fmt.Println(message)
break loop_label
}
}
fmt.Println("for文を終了します。")
}
実行結果
制限時間は 3s ね~
start
時間切れ~
context deadline exceeded
for文を終了します。
間に合った場合
package main
import (
"context"
"fmt"
"time"
)
func task(ctx context.Context, channel_kun chan string) {
fmt.Println("start")
time.Sleep(2 * time.Second)
fmt.Println("finish")
channel_kun <- "良くできました"
}
func main() {
channel_kun := make(chan string)
ctx := context.Background()
time_limit := 5 * time.Second
fmt.Println("制限時間は", time_limit, "ね~")
ctx, cancel := context.WithTimeout(ctx, time_limit)
defer cancel()
go task(ctx, channel_kun)
loop_label:
for {
select {
case <-ctx.Done():
fmt.Println("時間切れ~")
fmt.Println(ctx.Err())
break loop_label
// タスクが間に合った時。
case message := <-channel_kun:
fmt.Println("間に合いました")
fmt.Println(message)
break loop_label
}
}
fmt.Println("for文を終了します。")
}
実行結果
制限時間は 5s ね~
start
finish
間に合いました
良くできました
for文を終了します。