有一个程序从命令行读取两个输入:用户名和密码。只有在输入用户名后,才能在控制台中打印字符串“Password:”,但在我的程序中,它会立即打印出第一个字符串“Username:”。如何解决这个问题?
popd /?
答案 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:")
}
}