为什么Scanf的输入始终为0?

air*_*eak 0 input scanf go

我正在尝试从用户那里获取输入并打印出来,但显然距离的值是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")
    }
}
Run Code Online (Sandbox Code Playgroud)

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

func main() {
    p := new(Person)
    p.name = "Joker"

    p.walking()
}
Run Code Online (Sandbox Code Playgroud)

p.walking()会一直打印距离0吗?任何人都可以向我解释这里发生了什么?

icz*_*cza 5

您使用了错误的格式字符串.%f用于扫描浮点数,但您的变量distance是类型int,因此您应该使用%d:

fmt.Scanf("%d", &distance)
Run Code Online (Sandbox Code Playgroud)

或者将distance变量声明为浮点数,然后您可以使用%f:

var distance float64
fmt.Println("Enter the distance")
fmt.Scanf("%f", &distance)
Run Code Online (Sandbox Code Playgroud)

注意:

fmt.Scanf()返回成功扫描的项目数和可选错误.你应该习惯于在Go中处理错误,这会节省你很多时间.

通过存储和打印返回值作为最小值Scanf():

var distance int
fmt.Println("Enter the distance")
n, err := fmt.Scanf("%f", &distance)
fmt.Println(n, err)
Run Code Online (Sandbox Code Playgroud)

打印:

0 bad verb %f for integer
Run Code Online (Sandbox Code Playgroud)

这会立即告诉您0扫描的项目并且出现了错误:bad verb %f for integer这几乎是不言自明的.

这也解释了为什么你总是看到0打印千米:你的distance变量被初始化为0(零值int)并且永远不会改变.

如果扫描成功,您会看到以下输出:

1 <nil>
Run Code Online (Sandbox Code Playgroud)

意味着一个项目被成功扫描(distance)并且没有错误.

如果您通过一次Scanf()调用扫描多个项目,n可能会比1当然更大(例如fmt.Scanf("%f %d", &distance, &temp)).