0

我是 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")
}

我运行程序并输入了我的名字nixon

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

4

2 回答 2

3

func (*Reader) 读取字符串

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

输出(视窗):

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

修剪尾随换行符。例如,

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

输出(视窗):

Enter name:nixon
"nixon\r\n"
"nixon"
true
于 2018-12-16T18:11:58.220 回答
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")
}

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

于 2018-12-16T18:09:37.937 回答