我是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"。由于某些原因,上次检查无效。
答案 0 :(得分:5)
:
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上的终端等)