为了账号安全,请及时绑定邮箱和手机立即绑定

为什么没有类型不匹配错误?

为什么没有类型不匹配错误?

Go
largeQ 2021-06-18 18:01:40
我将用户输入的数字定义为 asvar input float64并输入一个整数,我希望得到一个错误,但我得到err = <nil>. 我错过了什么?package mainimport (    "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.goEnter a number to take its square root: 1err = <nil>n is 1:
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

Go 编程语言规范

转化次数

特定规则适用于数值类型之间的(非常量)转换。

数字类型之间的转换

对于非常量数值的转换,适用以下规则:

  1. 整数类型之间转换时,如果值为有符号整数,则符号扩展为隐式无限精度;否则它是零扩展。然后将其截断以适应结果类型的大小。例如,如果 v := uint16(0x10F0),则 uint32(int8(v)) == 0xFFFFFFF0。转换总是产生一个有效值;没有溢出的迹象。

  2. 将浮点数转换为整数时,分数将被丢弃(向零截断)。

  3. 将整数或浮点数转换为浮点类型,或将复数转换为另一种复杂类型时,结果值将四舍五入到目标类型指定的精度。例如,float32 类型的变量 x 的值可以使用超出 IEEE-754 32 位数字精度的额外精度进行存储,但 float32(x) 表示将 x 的值四舍五入到 32 位精度的结果。类似地,x + 0.1 可能使用超过 32 位的精度,但 float32(x + 0.1) 不会。

在所有涉及浮点或复数值的非常量转换中,如果结果类型不能表示转换成功但结果值依赖于实现的值。

在 Go 中,您可以将整数类型转换为浮点类型。因此,没有理由不原谅。

稳健性原则

在计算中,健壮性原则是软件的通用设计指南:

做事要保守,从别人那里接受的要自由(通常被改写为“发送的要保守,接受的要自由”)。

该原理也称为 Postel 定律,以互联网先驱 Jon Postel 的名字命名,他在传输控制协议的早期规范中写道:1

TCP 实现应该遵循健壮性的一般原则: > 做事要保守,从别人那里接受的要自由。

换句话说,向其他机器(或同一台机器上的其他程序)发送命令或数据的代码应该完全符合规范,但接收输入的代码应该接受不符合规范的输入,只要含义明确即可。


查看完整回答
反对 回复 2021-06-21
?
繁花如伊

TA贡献2012条经验 获得超12个赞

Scanf 扫描从标准输入读取的文本,将连续的空格分隔值存储到由格式确定的连续参数中。它返回成功扫描的项目数。

Scanf 返回它读取的内容数。在这种情况下 n == 1 因为...您输入了一个标记,后跟一个换行符。据推测,您想要的是 的值input,而不是n


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信