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

brn*_*d32 3 go

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

package main

import (
    "bufio"
    "os"
    "fmt"
)
// A simple program that verifies the user by username and password.

var loginstatus bool
var username, password string
func login(username, password string) bool {
    if username == "user123" && password == "pass123" {
        return true
    } else {
        return false
    }
}

func main() {
    fmt.Print("Username: ")
    user := bufio.NewScanner(os.Stdin)
    fmt.Print("Password: ")
    pass := bufio.NewScanner(os.Stdin)


    for user.Scan() && pass.Scan() {
        if login(user.Text(), pass.Text()) {
            fmt.Println("Signed in.")
            os.Exit(3)
        } else {
            fmt.Println("Incorrect username or password, please try again:")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*rew 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:")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)