0

I am new to Go.

I wrote the program below to allow a user to enter the 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.Println(name == "nixon")
}

I ran the program and entered my name nixon

Why is it that the output of fmt.Println(name == "nixon") is always false?

peterSO
  • 158,998
  • 31
  • 281
  • 276
Nixon Kosgei
  • 788
  • 8
  • 13

2 Answers2

3

func (*Reader) ReadString

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

ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter.


name terminal input includes trailing newlines. For example,

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

Output (Linux):

Enter name:nixon
"nixon\n"
false

Output (Windows):

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

Trim trailing newlines. For example,

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

}

Output (Linux):

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

Output (Windows):

Enter name:nixon
"nixon\r\n"
"nixon"
true
peterSO
  • 158,998
  • 31
  • 281
  • 276
1

modify your main function as following:

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

The line I added to your code trims new line char from your input.

peterSO
  • 158,998
  • 31
  • 281
  • 276
westdabestdb
  • 4,353
  • 20
  • 28