4

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

2 回答 2

3

Go 编程语言规范

转换

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

数值类型之间的转换

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

  1. 整数类型之间转换时,如果值为有符号整数,则符号扩展为隐式无限精度;否则为零扩展。然后将其截断以适应结果类型的大小。例如,如果 v := uint16(0x10F0),则 uint32(int8(v)) == 0xFFFFFFF0。转换总是产生一个有效值;没有溢出的迹象。
  2. 将浮点数转换为整数时,会丢弃小数(截断至零)。
  3. 将整数或浮点数转换为浮点类型,或将复数转换为另一种复数类型时,结果值将四舍五入到目标类型指定的精度。例如,可以使用超出 IEEE-754 32 位数字的附加精度来存储 float32 类型变量 x 的值,但 float32(x) 表示将 x 的值四舍五入为 32 位精度的结果。同样,x + 0.1 可能使用超过 32 位的精度,但 float32(x + 0.1) 不会。

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

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

稳健性原则

在计算中,稳健性原则是软件的一般设计指南:

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

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

TCP 实现应该遵循稳健性的一般原则:在你所做的事情上保持保守,在你从他人那里接受的事情上保持自由。

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

于 2013-07-04T20:16:57.933 回答
1

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

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

于 2014-08-31T16:20:10.160 回答