我知道,在:=
初始化表达式a := 5
之后,将右侧无类型常量转换为左侧类型变量。
它看起来与b := int(5)
语句相同。那么,第二个陈述的目的是什么?它与第一个陈述有何不同?
另外,在某个地方,我看到[]int(nil)
表达式,这有点让我感到困惑。
答案 0 :(得分:2)
您指的是type conversion。类型转换用于将一种类型的值转换为另一种类型的值。
表达式int(5)
将无类型5转换为值{5的int
。
表达式[]int(nil)
会将无类型的nil
转换为值[]int
的{{1}}。
陈述
nil
声明一个值为a := 5
b := int(5)
的变量。int
的声明使用default type表示整数常量(a
)。 int
的声明明确使用b
类型。否则,他们是一样的。在int
声明中使用默认类型通常优先于a
声明中的显式类型。类型转换通常用于默认类型以外的类型。示例b
。
答案 1 :(得分:2)
通常,您不需要将:=
与类型转换结合使用,因为它会使:=
失败。 :=
可以推断出类型。通常可以从常数值推断出类型。
但并非总是如此。例如......
package main
import (
"fmt"
)
func main() {
a := 5
b := uint(5)
var c uint = 5
fmt.Printf("%T\n", a)
fmt.Printf("%T\n", b)
fmt.Printf("%T\n", c)
}
a := 5
推断a
的类型为int
,但是如果您希望它是其他内容呢? 5
可能是a bunch of different integer types。也许是无符号整数?也许是一个特定长度的整数,如int16
?
您可以通过明确指定常量的类型(如b := uint(8)
)或明确指定变量的类型(如var c uint = 8
)来执行此操作。使用b := uint(8)
,b
的类型是从分配给它的uint常量推断出来的。对于var c uint = 8
,8
被推断为无符号整数,因为它被分配给类型为uint
的变量。在这两种情况下,b
和c
都属于uint
类型。
我不知道b := uint(8)
和var b uint = 8
之间存在任何显着差异,因此您使用的很大程度上取决于品味。我对var b uint = 8
有一个轻微的偏好设置,因为它与b := 8
在视觉上有所区别,以便明确使用显式类型。