终端输入与预期结果不符

时间:2018-12-16 18:06:07

标签: go gofmt

我是Go的新手。

我在下面编写了程序,以允许用户输入名称。

package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)

    fmt.Print("Enter name:")
    name, err := reader.ReadString('\n')
    if err != nil {
        panic(err)
    }

    fmt.Println(name == "nixon")
}

我运行了程序并输入了我的名字尼克松

为什么fmt.Println(name == "nixon")的输出总是false

2 个答案:

答案 0 :(得分:3)

  

func (*Reader) ReadString

func (b *Reader) ReadString(delim byte) (string, error)
     

ReadString读取直到输入中第一次出现delim为止,   返回一个字符串,该字符串包含直至(包括)   定界符。


name终端输入包括尾随换行符。例如,

package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)

    fmt.Print("Enter name:")
    name, err := reader.ReadString('\n')
    if err != nil {
        panic(err)
    }
    fmt.Printf("%q\n", name)

    fmt.Println(name == "nixon")
}

输出(Linux):

Enter name:nixon
"nixon\n"
false

输出(Windows):

Enter name:nixon
"nixon\r\n"
false

Trim尾随换行符。例如,

package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)

    fmt.Print("Enter name:")
    name, err := reader.ReadString('\n')
    if err != nil {
        panic(err)
    }
    fmt.Printf("%q\n", name)
    name = strings.TrimRight(name, "\r\n")
    fmt.Printf("%q\n", name)

    fmt.Println(name == "nixon")

}

输出(Linux):

Enter name:nixon
"nixon\n"
"nixon"
true

输出(Windows):

Enter name:nixon
"nixon\r\n"
"nixon"
true

答案 1 :(得分:1)

如下修改您的主要功能:

func main() {
  reader := bufio.NewReader(os.Stdin)

  fmt.Print("Enter name:")
  name, err := reader.ReadString('\n')
  if err != nil {
    panic(err)
  }
  name = strings.TrimSuffix(name, "\n")
  fmt.Println(name == "nixon")
}

我添加到代码中的行会从您的输入中修剪新的行字符。