我正在尝试从用户那里获取输入并将其打印出来,但在我做了一些输入之后,显然距离的值是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
?任何人都可以向我解释这里发生了什么吗?
答案 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
变量已初始化为0
(int
的零值)并且永远不会更改。< / p>
如果扫描成功,您会看到输出:
1 <nil>
意味着成功扫描了一个项目(distance
)并且没有错误。
如果您通过一次Scanf()
来电扫描多个项目,n
当然可能会大于1
(例如fmt.Scanf("%f %d", &distance, &temp)
)。