2017-04-21 42 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,我已經更新了描述和代碼,現在讓我知道它是否更好。 –