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. 整数または浮動小数点数を浮動小数点型に変換する場合、または複素数を別の複素数型に変換する場合、結果の値は変換先の型で指定された精度に丸められます。たとえば、float32 型の変数 x の値は、IEEE-754 の 32 ビット数値を超える追加の精度を使用して格納できますが、float32(x) は、x の値を 32 ビット精度に丸めた結果を表します。同様に、x + 0.1 は 32 ビットを超える精度を使用する場合がありますが、float32(x + 0.1) は使用しません。

浮動小数点または複素数値を含むすべての非定数変換では、結果の型が値を表すことができない場合、変換は成功しますが、結果の値は実装に依存します。

Go では、整数型から浮動小数点型に変換できます。したがって、許してはいけない理由はありません。

堅牢性の原則

コンピューティングでは、堅牢性の原則はソフトウェアの一般的な設計ガイドラインです。

行うことは保守的であり、他人から受け取るものは寛容である (「送信するものは保守的であり、受け入れるものは寛容である」と言い換えられることがよくあります)。

この原理は、インターネットのパイオニアである Jon Postel にちなんで、Postel の法則としても知られています

TCP の実装は、堅牢性の一般原則に従う必要があります。 > 行うことについては保守的であり、他の人から受け入れることについては寛大であること。

つまり、コマンドまたはデータを他のマシン (または同じマシン上の他のプログラム) に送信するコードは仕様に完全に準拠する必要がありますが、入力を受け取るコードは、意味が明確である限り、準拠していない入力を受け入れる必要があります。

于 2013-07-04T20:16:57.933 に答える