我试图从用户那里获取输入并将其打印出来,但显然距离的值是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?谁能向我解释这里发生了什么?
1 回答
四季花海
TA贡献1811条经验 获得超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)并且它永远不会改变。
如果扫描成功,您将看到以下输出:
1 <nil>
这意味着成功扫描了一项(distance)并且没有错误。
如果您一次Scanf()调用扫描多个项目,则n可能大于1当然(例如fmt.Scanf("%f %d", &distance, &temp))。
- 1 回答
- 0 关注
- 262 浏览
添加回答
举报
0/150
提交
取消