亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go:bufio.NewScanner 在 MacOS 上工作,但在 Windows 上被跳過

Go:bufio.NewScanner 在 MacOS 上工作,但在 Windows 上被跳過

Go
慕容3067478 2022-12-19 21:36:19
我有這段代碼,主要取自這里:fmt.Println("Please enter your role: ")fmt.Scanf("%s", &roleName)flag.StringVar(&startURL, "start-url", "", "AWS SSO Start URL")flag.StringVar(&accountID, "account-id", "", "AWS Account ID to fetch credentials for")flag.Parse()if startURL == "" || accountID == "" || roleName == "" {    flag.Usage()    os.Exit(1)}cfg := aws.Config{Region: "eu-west-1"}// create sso oidc client to trigger login flowssooidcClient := ssooidc.NewFromConfig(cfg)// register your client which is triggering the login flowregister, err := ssooidcClient.RegisterClient(context.TODO(), &ssooidc.RegisterClientInput{    ClientName: aws.String("sample-client-name"),    ClientType: aws.String("public"),    Scopes:     []string{"sso-portal:*"},})if err != nil {    fmt.Println(err)}// authorize your device using the client registration responsedeviceAuth, err := ssooidcClient.StartDeviceAuthorization(context.TODO(), &ssooidc.StartDeviceAuthorizationInput{    ClientId:     register.ClientId,    ClientSecret: register.ClientSecret,    StartUrl:     aws.String(startURL),})if err != nil {    fmt.Println(err)}// trigger OIDC login. open browser to login. close tab once login is done. press enter to continueurl := aws.ToString(deviceAuth.VerificationUriComplete)fmt.Printf("If browser is not opened automatically, please open link:\n%v\n", url)err = browser.OpenURL(url)if err != nil {    fmt.Println(err)}fmt.Println("Press ENTER key once login is done")// These lines get skipped on Windows// also tried bufio.NewReader(os.Stdin).ReadBytes('\n')// and fmt.Scanf("%s", &test)scanner := bufio.NewScanner(os.Stdin)scanner.Scan()if scanner.Err() != nil {    fmt.Println()}在 MacOS 上,程序等待用戶輸入,因此 SSO 登錄完美運行,在 Windows 上它被跳過,用戶沒有時間接受 AWS 端的登錄,因此程序失敗。此外,第一個詢問用戶角色的提示工作正常,所以我真的不明白第二個被跳過了嗎?我使用這些命令從 MacOS 機器構建二進制文件:GOOS=darwin go buildGOOS=windows go build
查看完整描述

1 回答

?
largeQ

TA貢獻2039條經驗 獲得超8個贊

fmt.Scanf("%s", &roleName)讀取令牌后的第一個空白字符后調用返回。


Windows 上的行終止符是\r\n. fmt.Scanf 調用在讀取\r. \n仍然在標準輸入中。后面的調用讀取stdinscanner.Scan()中的剩余部分并立即返回。\n


其他系統上的行終止符是\n。fmt.Scanf 調用在讀取整個行終止符后返回。調用scanner.Scan()等待用戶鍵入另一個行終止符。


一種解決方法是對所有輸入使用掃描儀:


scanner := bufio.NewScanner(os.Stdin)

fmt.Println("Please enter your role: ")

if !scanner.Scan() {

   // handle EOF

}

roleName = strings.TrimSpace(scanner.Text())

fmt.Println("Press ENTER key once login is done")

scanner.Scan()


查看完整回答
反對 回復 2022-12-19
  • 1 回答
  • 0 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號