2017-04-21 39 views
3

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

回答

5

线bufio.NewScanner(os.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:") 
     } 
    } 
} 
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:") 
    } 
} 
+1

你说你需要阅读从bufio.NewScanner字符串(这只是创建了一个扫描仪,它不读取任何字符串,所以这有点误导),然后你的例子根本不使用扫描仪。这个答案可能会让新的Go用户感到困惑。 – Adrian

+0

@Adrian,我已经更新了描述和代码,现在让我知道它是否更好。 –