Go中字符串的顺序输出和输入
有一个程序从命令行读取两个输入:用户名和密码。字符串“Password:”只应在输入用户名后在控制台中打印,但在我的程序中,它会立即与第一个字符串“username:”一起打印。如何解决这个问题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
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,我已经更新了说明和代码,现在告诉我是否更好。