I wrote a simple go program and it isn't working as it should:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Who are you?
Enter your name: ")
text, _ := reader.ReadString('
')
if aliceOrBob(text) {
fmt.Printf("Hello, ", text)
} else {
fmt.Printf("You're not allowed in here! Get OUT!!")
}
}
func aliceOrBob(text string) bool {
if text == "Alice" {
return true
} else if text == "Bob" {
return true
} else {
return false
}
}
It should ask the user to tell it's name and, if he is either Alice or Bob, greet him and else tell him to get out. The problem is, that even when the entered name is Alice or Bob, it tells the User to get out.
Alice:
/usr/lib/golang/bin/go run /home/jcgruenhage/go/workspace/src/github.com/jcgruenhage/helloworld/greet/greet.go
Who are you?
Enter your name: Alice
You're not allowed in here! Get OUT!!
Process finished with exit code 0
Bob:
/usr/lib/golang/bin/go run /home/jcgruenhage/go/workspace/src/github.com/jcgruenhage/helloworld/greet/greet.go
Who are you?
Enter your name: Bob
You're not allowed in here! Get OUT!!
Process finished with exit code 0
This is because your the text
is storing Bob
One way to solve this is using strings.TrimSpace
to trim the newline, eg:
import (
....
"strings"
....
)
...
if aliceOrBob(strings.TrimSpace(text)) {
...
Alternatively, you can also use ReadLine
instead of ReadString
, eg:
...
text, _, _ := reader.ReadLine()
if aliceOrBob(string(text)) {
...
The reason why the string(text)
is needed is because ReadLine will return you byte[]
instead of string
.
I don't know anything about Go, but you might want to strip the string of leading or trailing spaces and other whitespace (tabs, newline, etc) characters.
I think the source of confusion here is that:
text, _ := reader.ReadString('
')
Does not strip out the , but instead keeps it as last value, and ignores everything after it.
ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter.
https://golang.org/src/bufio/bufio.go?s=11657:11721#L435
And then you end up comparing Alice
and Alice
. So the solution is to either use Alice
in your aliceOrBob
function, or read the input differently, as pointed out by @ch33hau.