0
0

More than 3 years have passed since last update.

制限時間付き標準入力

Posted at

プログラムを書いていて一度は制限時間のある、標準入力を作りたいと思ったことはあると思います。因みに僕はありません。
以外と簡単に Go で実現できたのでメモがてら書きます。いつかの自分のためですね。

方法

方法はいたって簡単で、標準入力を受け取るサブルーチンを作って、入力テキストをチャンネルで受け取るだけです。

in := make(chan string, 1)
go func() {
    sc := bufio.NewScanner(os.Stdin)
    sc.Scan()
    in <- sc.Text()
}()

上記のチァンネルと time.NewTimertime.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("ゲームオーバー(笑)")
            }
        }
    }
}

締め

簡単でしたが、いつ使うんでしょうね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0