プログラムを書いていて一度は制限時間のある、標準入力を作りたいと思ったことはあると思います。因みに僕はありません。
以外と簡単に Go で実現できたのでメモがてら書きます。いつかの自分のためですね。
方法
方法はいたって簡単で、標準入力を受け取るサブルーチンを作って、入力テキストをチャンネルで受け取るだけです。
in := make(chan string, 1)
go func() {
sc := bufio.NewScanner(os.Stdin)
sc.Scan()
in <- sc.Text()
}()
上記のチァンネルと time.NewTimer
や time.NewTicker
を組み合わせることで簡単に実現できます。
timer := time.NewTimer(time.Second * 10)
select {
case text := <-in:
// 入力を使った処理
case <-timer.C:
// タイムアウト時の処理
}
適当に作ったサンプル
上記の方法で適当に作ったサンプルです。ローカルで実行してみると雰囲気を掴めると思います。
package main
import (
"bufio"
"fmt"
"os"
"time"
)
func main() {
in := make(chan string, 1)
go func() {
sc := bufio.NewScanner(os.Stdin)
sc.Scan()
in <- sc.Text()
}()
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
fmt.Println("制限時間は5秒。坊っちゃんの作者を入力して")
for i := 0; i < 5; i++ {
select {
case text := <-in:
if text == "夏目漱石" {
fmt.Printf("入力できてすごい\n")
} else {
fmt.Printf("間違えているよ\n%s\n", text)
}
i = 5
case <-ticker.C:
switch i {
case 0:
fmt.Println("制限時間あるので早めに")
case 1:
fmt.Println("はやくはやく")
case 2:
fmt.Println("邪魔だと思う?")
case 3:
fmt.Println("僕もそう思う")
case 4:
fmt.Println("ゲームオーバー(笑)")
}
}
}
}
締め
簡単でしたが、いつ使うんでしょうね。