go - 告诉我这段代码 GOLANG 有什么问题
问题描述
package main
import (
"fmt"
"math"
)
func main() {
distencecalc()
}
func distencecalc() {
fmt.Println("X1 :")
var x1 float64
fmt.Scanf("%f", &x1)
fmt.Print("")
fmt.Println("Y1 :")
var y1 float64
fmt.Scanf("%f", &y1)
fmt.Print("")
fmt.Println("Z1 :")
var z1 float64
fmt.Scanf("%f", &z1)
fmt.Print("")
fmt.Println("X2 :")
var x2 float64
fmt.Scanf("%f", &x2)
fmt.Print("")
fmt.Println("Y2 :")
var y2 float64
fmt.Scanf("%f", &y2)
fmt.Print("")
fmt.Println("Z2 :")
var z2 float64
fmt.Scanf("%f", &z2)
fmt.Print("")
var Xcalc = x2 - x1
var Ycalc = y2 - y1
var Zcalc = z2 - z1
var calcX = math.Pow(Xcalc, 2)
var calcY = math.Pow(Ycalc, 2)
var calcZ = math.Pow(Zcalc, 2)
var allcalc = calcX + calcZ + calcY
fmt.Println("the result is :")
fmt.Println(math.Sqrt(allcalc))
}
问题是我编译然后运行它询问 x1 的程序我输入值并同时询问 y1 和 z1。
解决方案
实际上,有问题的代码适用于 unix 系统,但通常问题是调用 likefmt.Scanf("%f", &x1)
不会消耗换行符,而是从包 doc 中引用fmt: Scanning
:
Scan、Fscan、Sscan 将输入中的换行符视为空格。
在 Windows 上,换行符不是单个\n
字符,而是\r\n
,因此后续fmt.Scanf()
调用将立即进行,而无需等待用户的进一步输入。
因此,您必须在格式字符串中添加换行符以避免后续fmt.Scanf()
调用继续:
fmt.Scanf("%f\n", &x1)
但更简单的是使用fmt.Scanln()
并跳过整个格式字符串:
fmt.Scanln(&x1)
Scanln、Fscanln 和 Sscanln 在换行处停止扫描,并要求项目后跟换行符或 EOF。
扫描仪函数 ( fmt.ScanXXX()
) 返回成功扫描的项目数和一个error
. 要判断扫描是否成功,您必须检查其返回值,例如:
if _, err := fmt.Scanln(&x1); err != nil {
fmt.Println("Scanning failed:", err)
}
推荐阅读
- angularjs - 如何知道当前 $formatters 操作正在针对哪个模型属性运行?
- c++ - (C++) 修改了常量引用?
- oauth-2.0 - 如何在 OpenID Connect 中使用访问令牌进行单点登录?
- javascript - 为什么 jquery 和 javascript 模糊事件无限循环
- javascript - 拆分后如何分配整数值给el的某些孩子?
- python - 使用 PythonAPI 向 CosmosDB 添加空间索引
- sql - Google Big Query 标准 SQL,在 SELECT 语句中添加一列
- python - 如何从我的 python 图表生成基于 Web 的报告
- javascript - 当我的网页不可滚动时,如何在移动设备上绕过 Safari
- angular - Angular 2+:使用主题(提供上下文)在孙指令(动态组件宿主)和特定父组件之间进行通信