Go中的顺序输出和字符串输入

时间:2017-04-21 09:47:30

标签: go

有一个程序从命令行读取两个输入:用户名和密码。只有在输入用户名后,才能在控制台中打印字符串“Password:”,但在我的程序中,它会立即打印出第一个字符串“Username:”。如何解决这个问题?

popd /?

2 个答案:

答案 0 :(得分:5)

bufio.NewScanner(os.Stdin)行只为stdin创建一个新的扫描程序,它实际上不会进行扫描,也不会阻止等待用户输入。在您通过Scan调用“用户名:”和“密码:”之前,它实际上不会从标准输入读取。

您可能不需要两个扫描程序来输入用户名和密码。一个扫描仪应该足够了,你可能想要将“用户名:”和“密码:”的打印移动到for循环中,如果你想再试一次这样看起来像:

func main() {
    scanner := bufio.NewScanner(os.Stdin)

    for {
        fmt.Print("Username: ")
        if !scanner.Scan() {
            break
        }
        user := scanner.Text()
        fmt.Print("Password: ")
        if !scanner.Scan() {
            break
        }
        pass := scanner.Text()
        if login(user, pass) {
            fmt.Println("Signed in.")
            os.Exit(3)
        } else {
            fmt.Println("Incorrect username or password, please try again:")
        }
    }
}

答案 1 :(得分:0)

您需要首先从bufio.NewScanner声明一个新的Scanner,然后使用方法ReadString从os.Stdin中读取数据:

func main() {
    scanner := bufio.NewReader(os.Stdin)

    fmt.Print("Username: ")
    user, _ := scanner.ReadString('\n')
    fmt.Print("Password: ")
    pass, _ := scanner.ReadString('\n')

    if login(user, pass) {
        fmt.Println("Signed in.")
        os.Exit(3)
    } else {
        fmt.Println("Incorrect username or password, please try again:")
    }
}