2015-06-30 21 views
0

我想做一個終端golang應用程序,其中用戶有4秒鐘輸入的東西。如果他輸入的東西更快,打印結果並要求他再輸入4秒鐘。在終端去應用程序的輸入超時

如果用戶在4秒內不會返回輸入,程序必須寫入time out並再次詢問他的輸入。

我的代碼這樣做,但只有一次。在第一個timeout之後,即使用戶比4秒快,也不會返回任何結果。我無法弄清楚爲什麼這樣。

代碼

package main 

import (
    "bufio" 
    "fmt" 
    "log" 
    "os" 
    "time" 
) 

var (
    result string 
    err error 
) 

func getInput(input chan string) { 
    in := bufio.NewReader(os.Stdin) 
    result, err := in.ReadString('\n') 
    if err != nil { 
     log.Fatal(err) 
    } 

    input <- result 
} 

func main() { 
    for { 
     fmt.Println("input something") 
     input := make(chan string, 1) 
     go getInput(input) 

     select { 
     case i := <-input: 
      fmt.Println("result") 
      fmt.Println(i) 
     case <-time.After(4000 * time.Millisecond): 
      fmt.Println("timed out") 
     } 
    } 
} 

輸出:

input something 
123 
result 
123 

input something 
2 
result 
2 

input something 
timed out 
input something 
2 
timed out 
input something 
timed out 
input something 

回答

3

的問題與你得到了用戶的輸入的方式去做。在超時時間,你會產生一個新的去程序來請求輸入,但是之前產生的舊程序仍然會抓取輸入並將其發送到無人聽到的頻道。

將其更改爲這樣的事情會解決這個問題:

func getInput(input chan string) { 
    for { 
     in := bufio.NewReader(os.Stdin) 
     result, err := in.ReadString('\n') 
     if err != nil { 
      log.Fatal(err) 
     } 

     input <- result 
    } 
} 

func main() { 
    input := make(chan string, 1) 
    go getInput(input) 

    for { 
     fmt.Println("input something") 

     select { 
     case i := <-input: 
      fmt.Println("result") 
      fmt.Println(i) 
     case <-time.After(4000 * time.Millisecond): 
      fmt.Println("timed out") 
     } 
    } 
} 
相關問題