1 回答
TA贡献1786条经验 获得超13个赞
语法foo(expr)where foois a type and expris a type conversion,如规范中所述:
转化次数
转换是形式为T(x)where Tis a type and x is an expression that can convert to type 的表达式T。
转换 = 类型 "(" 表达式 [ "," ] ")" 。
如果类型以运算符*or开头<-,或者类型以关键字开头func且没有结果列表,则必须在必要时将其括起来以避免歧义:
*Point(p) // same as *(Point(p))
(*Point)(p) // p is converted to *Point
<-chan int(c) // same as <-(chan int(c))
(<-chan int)(c) // c is converted to <-chan int
func()(x) // function signature func() x
(func())(x) // x is converted to func()
(func() int)(x) // x is converted to func() int
func() int(x) // x is converted to func() int (unambiguous)
在以下任何一种情况下,常量值x都可以转换为类型T:
x可以用一个类型的值来表示T。
x是浮点常量,T是浮点类型,并且x可以T使用 IEEE 754 舍入到偶数规则舍入后由 type 的值表示。常数T(x)是四舍五入的值。
x是整数常量,T是字符串类型。x在这种情况下适用与非常量相同的规则。
转换一个常量会产生一个类型化的常量作为结果。
uint(iota) // iota value of type uint
float32(2.718281828) // 2.718281828 of type float32
complex128(1) // 1.0 + 0.0i of type complex128
float32(0.49999999) // 0.5 of type float32
string('x') // "x" of type string
string(0x266c) // "♬" of type string
MyString("foo" + "bar") // "foobar" of type MyString
string([]byte{'a'}) // not a constant: []byte{'a'} is not a constant
(*int)(nil) // not a constant: nil is not a constant, *int is not a boolean, numeric, or string type
int(1.2) // illegal: 1.2 cannot be represented as an int
string(65.0) // illegal: 65.0 is not an integer constant
在以下任何一种情况下,非常量值 x 都可以转换为类型 T:
x可分配给T。
x的类型并T具有相同的基础类型。
x的类型并且T是未命名的指针类型,并且它们的指针基类型具有相同的底层类型。
x的类型并且T都是整数或浮点类型。x的类型 和T都是复杂类型。
x是一个整数或一个字节片或符文,并且T是一个字符串类型。
x是一个字符串,T是一个字节或符文的切片。
特定规则适用于数字类型之间或与字符串类型之间的(非常量)转换。这些转换可能会改变表示x并产生运行时成本。所有其他转换仅更改类型,而不更改x.
没有在指针和整数之间转换的语言机制。包 unsafe 在受限情况下实现此功能。
有关更多详细信息,请参阅链接页面。
- 1 回答
- 0 关注
- 164 浏览
添加回答
举报