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

Go中字符串的顺序输出和输入,go,Go,有一个程序从命令行读取两个输入:用户名和密码。字符串“Password:”只应在输入用户名后在控制台中打印,但在我的程序中,它会立即与第一个字符串“username:”一起打印。如何解决这个问题 package main import ( "bufio" "os" "fmt" ) // A simple program that verifies the user by username and password. var loginstatus bool var u

有一个程序从命令行读取两个输入:用户名和密码。字符串“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:")
        }
    }
}

bufio.NewScanner(os.Stdin)
只是为Stdin创建了一个新的扫描仪,它实际上并不进行扫描,也不会阻止等待用户输入。在调用
Scan
之前,它实际上不会从stdin读取数据,此时“用户名:”和“密码:”已经打印出来

您可能不需要两个用户名和密码扫描仪。一个扫描器就足够了,如果您想再试一次,您可能需要将“用户名:”和“密码:”的打印移到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:")
        }
    }
}

您需要首先从bufio.NewScanner声明一个新的扫描仪,然后使用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:")
    }
}

您说需要从bufio.NewScanner读取字符串(它只创建了一个扫描器,不读取任何字符串,所以这有点误导),然后您的示例根本不使用扫描器。这个答案可能会让新的围棋用户感到困惑。@Adrian,我已经更新了说明和代码,现在告诉我是否更好。