2017-01-21 5 views
0

Я новичок в GoLang, и я столкнулся с проблемой с этим условием: Даже если вход пользователя «1», он не входит в оператор if.Проверка строки ввода пользователя

package main 

import (
    "bufio" 
    "fmt" 
    "os" 
    "strconv" 
    "math" 
    "strings" 
) 

func prompt(toprint string) string{ 
    if(toprint == ""){ 
     toprint = "Enter text :"; 
    } 
    reader := bufio.NewReader(os.Stdin); 
    fmt.Println(toprint); 
    text, _ := reader.ReadString('\n'); 
    return text; 
} 

func main() { 
    choice := prompt("Please enter '1'"); 

    if(strings.Compare("1",choice)==0||choice=="1"){ 
     // D'ONT ENTER HERE EVEN WHEN choice=="1" 
    }else{ 
     // Always go here 
    } 
} 

Благодарим за помощь.

ответ

4

Это потому, что reader.ReadString возвращает весь текст, включая разделитель, поэтому возвращаемая строка будет 1\n не только 1. Из the documentation (курсив мой):

func (*Reader) ReadString 

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

ReadString читает до первого появления delim на входе, возвращая строку, содержащую данные до и включая разделитель. Если ReadString обнаруживает ошибку перед поиском разделителя, он возвращает данные, считанные перед ошибкой и самой ошибкой (часто io.EOF). ReadString возвращает err != nil тогда и только тогда, когда возвращаемые данные не заканчиваются на delim. Для простых целей может быть более удобным использование Scanner.

Может быть, вы хотите сделать

return strings.TrimSpace(text) 

в конце prompt().

0

Спасибо! Вот код «prompt()», который возвращает правильный ввод:

func prompt(toprint string) string{ 
    if(toprint == ""){ 
     toprint = "Enter text :"; 
    } 
    reader := bufio.NewReader(os.Stdin); 
    fmt.Println(toprint); 
    text, _ := reader.ReadString('\n'); 
    return text[0:len(text)-2]; 
} 
Смежные вопросы