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

时间:2013-07-04 19:51:14

标签: go

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

2 个答案:

答案 0 :(得分:3)

  

Go编程语言规范

     

Conversions

     

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

     

数字类型之间的转换

     

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

     
      
  1. 在整数类型之间进行转换时,如果值是有符号的   整数,符号扩展为隐式无限精度;   否则它是零扩展。然后将其截断以适应   结果类型的大小。例如,如果v:= uint16(0x10F0),那么   uint32(int8(v))== 0xFFFFFFF0。转换始终产生有效   值;没有溢出的迹象。
  2.   
  3. 将浮点数转换为整数时,分数   被丢弃(截断为零)。
  4.   
  5. 将整数或浮点数转换为a时   浮点类型,或复数类型到另一个复杂类型,   结果值四舍五入到由指定的精度   目的地类型。例如,类型的变量x的值   float32可以使用超出的精度来存储   IEEE-754是32位数字,但float32(x)表示结果   将x的值舍入为32位精度。类似地,x + 0.1可以使用   超过32位的精度,但float32(x + 0.1)没有。
  6.         

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

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

  

Robustness principle

     

在计算中,鲁棒性原则是一般设计指南   对于软件:

     

在你所做的事情上要保守,在你接受他人的事上保持自由   (通常改写为“对你发送的内容保守,是的   你所接受的自由主义者“)。

     

这一原则也被称为Postel的法律,是继互联网先驱之后   Jon Postel,他在早期的传输规范中写道   控制协议:1

     

TCP实现应遵循健壮性的一般原则:在&gt;中保守。你做了什么,对你是开明的   接受他人。

     

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

答案 1 :(得分:1)

  

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

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