Терминальный вход не соответствует ожидаемому результату - PullRequest
0 голосов
/ 16 декабря 2018

Я новичок в 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 голосов
/ 16 декабря 2018

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
0 голосов
/ 16 декабря 2018

измените вашу основную функцию следующим образом:

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

Строка, которую я добавил в ваш код, обрезает новый символ строки из вашего ввода.

...