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

我将用户输入的数字定义为 asvar 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:


largeQ
浏览 207回答 2
2回答

幕布斯7119047

Go 编程语言规范转化次数特定规则适用于数值类型之间的(非常量)转换。数字类型之间的转换对于非常量数值的转换,适用以下规则:整数类型之间转换时,如果值为有符号整数,则符号扩展为隐式无限精度;否则它是零扩展。然后将其截断以适应结果类型的大小。例如,如果 v := uint16(0x10F0),则 uint32(int8(v)) == 0xFFFFFFF0。转换总是产生一个有效值;没有溢出的迹象。将浮点数转换为整数时,分数将被丢弃(向零截断)。将整数或浮点数转换为浮点类型,或将复数转换为另一种复杂类型时,结果值将四舍五入到目标类型指定的精度。例如,float32 类型的变量 x 的值可以使用超出 IEEE-754 32 位数字精度的额外精度进行存储,但 float32(x) 表示将 x 的值四舍五入到 32 位精度的结果。类似地,x + 0.1 可能使用超过 32 位的精度,但 float32(x + 0.1) 不会。在所有涉及浮点或复数值的非常量转换中,如果结果类型不能表示转换成功但结果值依赖于实现的值。在 Go 中,您可以将整数类型转换为浮点类型。因此,没有理由不原谅。稳健性原则在计算中,健壮性原则是软件的通用设计指南:做事要保守,从别人那里接受的要自由(通常被改写为“发送的要保守,接受的要自由”)。该原理也称为 Postel 定律,以互联网先驱 Jon Postel 的名字命名,他在传输控制协议的早期规范中写道:1TCP 实现应该遵循健壮性的一般原则: > 做事要保守,从别人那里接受的要自由。换句话说,向其他机器(或同一台机器上的其他程序)发送命令或数据的代码应该完全符合规范,但接收输入的代码应该接受不符合规范的输入,只要含义明确即可。

繁花如伊

Scanf 扫描从标准输入读取的文本,将连续的空格分隔值存储到由格式确定的连续参数中。它返回成功扫描的项目数。Scanf 返回它读取的内容数。在这种情况下 n == 1 因为...您输入了一个标记,后跟一个换行符。据推测,您想要的是 的值input,而不是n。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go