9

次のように int を float64 に変換できます。

var a int = 10
var b float64 = float64(a)

型アサーションに関して、Effective Go は次のように述べています。

それを念頭に置いて、なぜ次のことが失敗するのですか:

func foo(a interface{}) {
    fmt.Println(a.(float64))
}

func main() {
    var a int = 10
    foo(a)
}

これにより、panic: interface conversion: interface is int, not float64.

Go Spec には次のように記載されていることに注意してください。

'インターフェイス型の式 x と型 T の場合、一次式

x.(T)

x が nil ではなく、x に格納されている値が T 型であることをアサートします。

これはEffective Goステートメントと矛盾していますが、私が見ているものとより一致しているようです.

4

3 に答える 3

9

このEffective Goの文は確かに紛らわしいようです. その時作者は構造体のことを考えていたようです。

仕様のアサーションに関する章は、より明確です。

インターフェイス型と型 T の式 x の場合、一次式

x.(T) は、x が nil ではなく、x に格納されている値が T 型であることをアサートします。表記 x.(T) は、型アサーションと呼ばれます。

より正確には、T がインターフェイス型でない場合、x.(T) は x の動的型が T 型と同一であると主張します。この場合、T は x の (インターフェイス) 型を実装する必要があります。それ以外の場合、x は T 型の値を格納できないため、型アサーションは無効です。T がインターフェイス型の場合、x.(T) は、x の動的型がインターフェイス T を実装することをアサートします。

int を float (およびその逆) に変換できるという事実は、それらが同じ型であると断言できるという意味ではありません。

于 2013-05-30T13:28:42.630 に答える
0

インターフェイス型から基になる型へのアサートのみを入力できます。この場合intint次に、からへの型変換を使用しますfloat64

于 2014-05-30T18:29:36.280 に答える