内置类型的函数式初始化的目的是什么?

时间:2017-12-01 22:47:46

标签: go

我知道,在:=初始化表达式a := 5之后,将右侧无类型常量转换为左侧类型变量。 它看起来与b := int(5)语句相同。那么,第二个陈述的目的是什么?它与第一个陈述有何不同? 另外,在某个地方,我看到[]int(nil)表达式,这有点让我感到困惑。

2 个答案:

答案 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 = 88被推断为无符号整数,因为它被分配给类型为uint的变量。在这两种情况下,bc都属于uint类型。

我不知道b := uint(8)var b uint = 8之间存在任何显着差异,因此您使用的很大程度上取决于品味。我对var b uint = 8有一个轻微的偏好设置,因为它与b := 8在视觉上有所区别,以便明确使用显式类型。