我将用户输入的数字定义为var input float64
,我输入一个整数,我希望得到一个错误,但我得到err = <nil>
。我错过了什么?
package main
import (
"fmt"
)
func main() {
var input float64
fmt.Print("Enter a number:")
n, err := fmt.Scanf("%f\n", &input)
fmt.Printf("err = %v\n", err)
if err != nil {
fmt.Printf("%v is not a float - exiting with error\n", input, err)
return
}
fmt.Printf("n is %v:", n)
}
这是输出:
C:\Go\src\play\exercise>go run exercise2.go
Enter a number to take its square root: 1
err = <nil>
n is 1:
答案 0 :(得分:3)
Go编程语言规范
特定规则适用于数字之间的(非常量)转换 类型。
数字类型之间的转换
对于非常量数值的转换,遵循以下规则 适用:
- 在整数类型之间进行转换时,如果值是有符号的 整数,符号扩展为隐式无限精度; 否则它是零扩展。然后将其截断以适应 结果类型的大小。例如,如果v:= uint16(0x10F0),那么 uint32(int8(v))== 0xFFFFFFF0。转换始终产生有效 值;没有溢出的迹象。
- 将浮点数转换为整数时,分数 被丢弃(截断为零)。
- 将整数或浮点数转换为a时 浮点类型,或复数类型到另一个复杂类型, 结果值四舍五入到由指定的精度 目的地类型。例如,类型的变量x的值 float32可以使用超出的精度来存储 IEEE-754是32位数字,但float32(x)表示结果 将x的值舍入为32位精度。类似地,x + 0.1可以使用 超过32位的精度,但float32(x + 0.1)没有。
醇>涉及浮点或复数的所有非常量转换 值,如果结果类型不能表示转换的值 成功但结果值依赖于实现。
在Go中,您可以从整数类型转换为浮点类型。因此,没有理由不宽容。
在计算中,鲁棒性原则是一般设计指南 对于软件:
在你所做的事情上要保守,在你接受他人的事上保持自由 (通常改写为“对你发送的内容保守,是的 你所接受的自由主义者“)。
这一原则也被称为Postel的法律,是继互联网先驱之后 Jon Postel,他在早期的传输规范中写道 控制协议:1
TCP实现应遵循健壮性的一般原则:在&gt;中保守。你做了什么,对你是开明的 接受他人。
换句话说,将命令或数据发送到其他机器的代码(或 对同一台机器上的其他程序)应完全符合 规范,但接收输入的代码应该接受 只要含义明确,就不符合要求。
答案 1 :(得分:1)
Scanf扫描从标准输入读取的文本,将连续的空格分隔值存储到由格式确定的连续参数中。 返回成功扫描的项目数。
Scanf返回它读取的内容。在这种情况下,n == 1,因为...您输入了一个标记后跟换行符。据推测,您需要input
的值,而不是n
。