reader.ReadString不会删除第一次出现的delim

时间:2016-05-08 13:02:50

标签: if-statement go

我写了一个简单的go程序,它没有正常工作:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Who are you? \n Enter your name: ")
    text, _ := reader.ReadString('\n')
    if aliceOrBob(text) {
        fmt.Printf("Hello, ", text)
    } else {
        fmt.Printf("You're not allowed in here! Get OUT!!")
    } 
}

func aliceOrBob(text string) bool {
    if text == "Alice" {
        return true
    } else if text == "Bob" {
        return true
    } else {
        return false
    }
}

它应该要求用户告诉它的名字,如果他是Alice或Bob,请问他,否则告诉他出去。  问题是,即使输入的名称是Alice或Bob,它也会告诉用户离开。

爱丽丝:

/usr/lib/golang/bin/go run /home/jcgruenhage/go/workspace/src/github.com/jcgruenhage/helloworld/greet/greet.go
Who are you? 
Enter your name: Alice
You're not allowed in here! Get OUT!!
Process finished with exit code 0

鲍勃:

/usr/lib/golang/bin/go run /home/jcgruenhage/go/workspace/src/github.com/jcgruenhage/helloworld/greet/greet.go
Who are you? 
Enter your name: Bob
You're not allowed in here! Get OUT!!
Process finished with exit code 0

4 个答案:

答案 0 :(得分:2)

这是因为text正在存储Bob\n

解决此问题的一种方法是使用strings.TrimSpace修剪换行符,例如:

import (
    ....
    "strings"
    ....
)

...
if aliceOrBob(strings.TrimSpace(text)) {
...

或者,您也可以使用ReadLine代替ReadString,例如:

...
text, _, _ := reader.ReadLine()
if aliceOrBob(string(text)) {
...

需要string(text)的原因是因为ReadLine会返回byte[]而不是string

答案 1 :(得分:2)

我认为这里混淆的原因是:

text, _ := reader.ReadString('\n')

不会删除\n,而是将其保留为最后一个值,并忽略其后的所有内容。

  

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

https://golang.org/src/bufio/bufio.go?s=11657:11721#L435

然后您最终会比较AliceAlice\n。因此解决方案是在Alice\n函数中使用aliceOrBob,或者以不同的方式读取输入,如@ ch33hau所指出的那样。

答案 2 :(得分:0)

我对Go一无所知,但您可能想要删除前导或尾随空格以及其他空格(制表符,换行符等)字符的字符串。

答案 3 :(得分:0)

reader.ReadLine() 

可以离开“ \ n”,但reader.ReadString()不能