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

时间:2015-08-10 08:16:45

标签: input go scanf

我正在尝试从用户那里获取输入并将其打印出来,但在我做了一些输入之后,显然距离的值是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")
    }
}

正如您在我的main函数上尝试运行此命令时所看到的那样,即使distance的值大于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?任何人都可以向我解释这里发生了什么吗?

1 个答案:

答案 0 :(得分:5)

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

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

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

var distance float64
fmt.Println("Enter the distance")
fmt.Scanf("%f", &distance)

注意:

fmt.Scanf()返回成功扫描的项目数,以及可选错误。您应该习惯于在Go中处理错误,这将为您节省大量时间。

通过存储和打印Scanf()

的返回值作为最小值
var distance int
fmt.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变量已初始化为0int的零值)并且永远不会更改。< / p>

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

1 <nil>

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

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