为了账号安全,请及时绑定邮箱和手机立即绑定

按 Enter 时分配的默认值

按 Enter 时分配的默认值

Go
牧羊人nacy 2022-11-23 19:22:23

我想要在按下时分配一个默认值Enter而不给出一个。


根据我的经验, Go Playground不处理 fmt.Scan 输入,所以我在这里引用代码:(

如果可能,请告诉我怎么做!)


package main


import (

    "fmt"

    "time"

)


func main() {

    t := 0

    fmt.Print("seconds? ")

    fmt.Scan(&t)

    time.Sleep(time.Duration(t) * time.Second)

    fmt.Println("in", t)

}

我已经初始化了 to 的值,t但是0当我在没有给出值的情况下按下时Enter,程序会一直等到我给出一些值。我对错误检查不感兴趣(如果可能的话)。我只想让代码接受一次Enter按下,因为0 Enter.


查看完整描述

2 回答

?
千巷猫影

TA贡献1518条经验 获得超7个赞

只需使用fmt.Scanln()而不是fmt.Scan()

fmt.Scanln(&t)

引用自fmt.Scanln()

Scanln 与 Scan 类似,但在换行处停止扫描,并且在最后一项之后必须有换行符或 EOF。

另一方面,fmt.Scan()不会停在换行符处,而是:

Scan 扫描从标准输入读取的文本,将连续的空格分隔值存储到连续的参数中。换行算作空格。

一般来说,我建议使用bufio.Scanner按行读取输入,并用这些行做任何你想做的事情(检查它是否为空,或者按照你想要的方式解析它)。bufio.NewScanner()允许您使用(预定义的)字符串作为源(结合strings.NewReader()– 以便于测试)或者os.Stdin如果您想读取用户输入则通过。


查看完整回答
反对 回复 2022-11-23
?
ibeautiful

TA贡献1705条经验 获得超5个赞

您可以使用bufio.Reader


package main


import (

    "bufio"

    "fmt"

    "os"

    "strconv"

    "strings"

    "time"

)


func main() {

    var t int


    reader := bufio.NewReader(os.Stdin)

    fmt.Print("seconds? ")

    for {

        tStr, err := reader.ReadString('\n')

        tStr = strings.TrimSpace(tStr)


        t, err = strconv.Atoi(tStr)

        if err != nil {

            fmt.Println("invalid input, please write a number")

            continue

        }

        break

    }


    time.Sleep(time.Duration(t) * time.Second)

    fmt.Println("in", t)

}


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信