Golang没有处理2个操作

时间:2016-03-23 14:23:44

标签: go

我是golang的新手,我不明白为什么我无法使下一代码正常工作:

func ListApps(){
    fmt.Printf("\nPress Q to go back..\n")
    reader := bufio.NewReader(os.Stdin)
    input, _ := reader.ReadString('\n')

    if string(input) == "q" {
        fmt.Printf("OK")
     }
 }

我想打印一条消息,然后在控制台中扫描用户的输入,比较输入和打印messafe,如果输入等于字符串" q"。由于某些原因,上次检查无效。

2 个答案:

答案 0 :(得分:5)

来自TFM的

  

ReadString读取直到输入中第一次出现delim,返回包含数据的字符串,直到并包括分隔符

您正在比较没有分隔符的字符串。

所以这样做:

if input == "q\n" {...}

可以工作(BTW无需调用string(input)因为输入已经是一个字符串)。

或者,您也可以使用strings.TrimRight在检查前修剪结束行。这将使代码更具可移植性,因为它可以在Windows上使用\r\n来分隔行。所以这样做:

input = strings.TrimRight(input, "\r\n")
if input == "q" {
    fmt.Println("OK")
}

我已经测试过这个让自己工作了。

答案 1 :(得分:2)

Not_a_Golfer对于它无效的原因是正确的。但是,对于像从STDIN读取这样简单的事情,最好使用Scanner:

func ListApps(){
    fmt.Printf("\nPress Q to go back..\n")
    reader := bufio.NewScanner(os.Stdin)
    reader.Scan()  // this line scans the STDIN for input

    // error checking...
    if err := scanner.Err(); err != nil {
        panic(err)
    }

    // To access what the scanner got, you use scanner.Text() (reader.Text() in this case)
    if reader.Text() == "q" {
        fmt.Printf("OK")
     }
 }

这将起作用,无论输入来自哪里(Windows命令提示符,linux / OSX上的终端等)