【问题标题】:Terminal input doesn't match expected result终端输入与预期结果不匹配
【发布时间】:2018-12-16 18:06:06
【问题描述】:

我是 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")的输出总是false

【问题讨论】:

    标签: go gofmt


    【解决方案1】:

    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
    

    修剪尾随换行符。例如,

    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
    

    【讨论】:

    • 刚刚添加了这个,它起作用了! name = strings.TrimRight(name, "\r\n")\o
    【解决方案2】:

    修改你的主要功能如下:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2012-11-30
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多