为什么Scanf的输入总是0?

我试图从用户那里获取输入并将其打印出来,但显然距离的值是0,在我做了一些输入之后。


这是代码:


type Person struct {

    name string

    age int

    ambition string

}


func (p *Person) walking() {

    var distance int

    fmt.Println("Enter the distance")

    fmt.Scanf("%f", &distance)


    if distance < 9 {

        fmt.Println(p.name, " is walking towards that direction in ", distance,

            "kilometer")

    } else {

        fmt.Println("This is an error, ignore this")

    }

}

正如您所看到的,每当我尝试在主函数上运行此命令时,fmt.Println(p.name, " is walking towards that direction in ", distance, "kilometer")即使距离的值大于9.


func main() {

    p := new(Person)

    p.name = "Joker"


    p.walking()

}

p.walking()将始终打印距离为0?谁能向我解释这里发生了什么?


开心每一天1111
浏览 265回答 1
1回答

四季花海

您使用了错误的格式字符串。%f用于扫描浮点数,但您的变量distance类型为int,因此您应该使用%d:fmt.Scanf("%d", &distance)或者将distance变量声明为浮点数,然后您可以使用%f:var distance float64fmt.Println("Enter the distance")fmt.Scanf("%f", &distance)笔记:fmt.Scanf()返回成功扫描的项目数和可选错误。您应该习惯于处理 Go 中的错误,这会为您节省大量时间。通过存储和打印 的返回值来最小化Scanf():var distance intfmt.Println("Enter the distance")n, err := fmt.Scanf("%f", &distance)fmt.Println(n, err)印刷:0 bad verb %f for integer这会立即告诉您0已扫描项目并出现错误:bad verb %f for integer这几乎是不言自明的。这也解释了为什么您总是看到0打印出的公里数:您的distance变量被初始化为0( 的零值int)并且它永远不会改变。如果扫描成功,您将看到以下输出:1 <nil>这意味着成功扫描了一项(distance)并且没有错误。如果您一次Scanf()调用扫描多个项目,则n可能大于1当然(例如fmt.Scanf("%f %d", &distance, &temp))。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go