混淆创造新类型

时间:2013-07-03 17:45:59

标签: go

我有这样的代码:

type ErrNegativeSqrt float64

为什么这样的构造可用?

float64(ErrNegativeSqrt(-2))

哪个'机制'用于在ErrNegativeSqrt中存储-2?

3 个答案:

答案 0 :(得分:4)

ErrNegativeSqrttype而不是变量。值存储在变量中。

type ErrNegativeSqrt float64
// x is a variable of type ErrNegativeSqrt with an initial value of -2
var x ErrNegativeSqrt = -2

更新:

  

Go编程语言规范

     

Constants

     

有布尔常量,符文常量,整数常量,   浮点常量,复数常量和字符串常量。   字符,整数,浮点和复数常量   统称为数字常数。

     

常量值由符文,整数,浮点数表示,   imaginary,或string literal,表示常量的标识符,a   常量表达式,具有常量结果的转换,或   一些内置函数的结果值,如unsafe.Sizeof   适用于某些表达式的任何值,上限或len,真实和   imag应用于复数常量和复数应用于数值   常量。布尔真值由预先声明的表示   常量是真是假。预先标识的标识符iota表示   整数常数。

     

数字常量表示任意精度的值,而不是   溢出。

     

常量可以是键入的或非类型的。文字常量,真,假,   iota,以及某些仅包含无类型的常量表达式   常数操作数是无类型的。

     

常量可以通过常量声明明确地给出一个类型   转换,或在变量声明或。中使用时隐式转换   赋值或作为表达式中的操作数。

     

Conversions

     

转换是T(x)形式的表达式,其中T是类型和x   是一个可以转换为T类型的表达式。

ErrNegativeSqrt(-2)是一种转化。无类型常量-2将转换为ErrNegativeSqrt类型,因为作为操作数,它可以在ErrNegativeSqrt的{​​{1}}基础类型中表示。

答案 1 :(得分:1)

ErrNegativeSqrt(-2)是可能的,因为ErrNegativeSqrt是一个内部的float64,它被规范描述为能够保存“IEEE-754 64位浮点数”。

http://en.wikipedia.org/wiki/IEEE_floating_point

答案 2 :(得分:1)

这称为转化,请参见此处:http://golang.org/ref/spec#Conversions。它描述了如何通过在兼容时将另一个值转换为该类型来创建值。这里-2可以表示为float64。