类型断言表达式的语法形式是x.(T)。其中的x代表要被判断类型的那个值。这个值当下的类型必须是接口类型的,不过具体是哪接口类型其实是无所谓的。 所以,当这里的container变量类型不是任何的接口类型时,我们就需要先把它转成某个接口类型的值。 如果container是某个接口类型的,那么这个类型断言表达式就可以是container.([]string)。
interface{}代表空接口,任何类型都是它的实现类型。任何类型的值都可以很方便地被转换成空接口
具体语法是interface{}(x),例如前面展示的interface{}(container)。
一对不包裹任何东西的花括号,除了可以代表空的代码块之外,还可以用于表示不包含任何内容的数据结构(或者说数据类型)。
类型转换:
首先,对于整数类型值、整数常量之间的类型转换,原则上只要源值在目标类型的可表示范围内就是合法的。
比如,之所以uint8(255)可以把无类型的常量255转换为uint8类型的值,是因为255在 [0, 255] 的范围。
第二,虽然直接把一个整数值转换为一个string类型的值是可行的,但值得关注的是,被转换的整数值应该可以代表一个有效的Unicode 代码点,否则转换的结果将会是"�"。
如:string(-1)
第三个知识点是关于string类型与各种切片类型之间的互转的.
一个值在从string类型向[]byte类型转换时代表着以UTF-8 编码的字符串会被拆分成零散、独立的字节。
除了与 ASCII 编码兼容的那部分字符集,以 UTF-8 编码的某个单一字节是无法代表一个字符的。
str := string([]byte{'\xe4', '\xbd', '\xa0', '\xe5', '\xa5', '\xbd'}) // 你好
UTF-8 编码的三个字节\xe4、\xbd和\xa0合在一起才能代表字符'你',而\xe5、\xa5和\xbd合在一起才能代表字符'好'。
一个值在从string类型向[]rune类型转换时代表着字符串会被拆分成一个个 Unicode 字符。
string([]rune{'\u4F60', '\u597D'}) // 你好
别名类型:
type MyString = string
别名类型与其源类型的区别恐怕只是在名称上,它们是完全相同的。
源类型与别名类型是一对概念,是两个对立的称呼。别名类型主要是为了代码重构而存在的.
Go 语言内建的基本类型中就存在两个别名类型。byte是uint8的别名类型,而rune是int32的别名类型。
潜在类型:
type MyString2 string // 注意,这里没有等号。
这里的MyString2是一个新的类型,不同于其他任何类型。
string可以被称为MyString2的潜在类型。潜在类型的含义是某个类型在本质上是哪个类型或者是哪个类型的集合。
潜在类型相同的不同类型的值之间是可以进行类型转换的,因此,MyString2类型的值与string类型的值可以使用类型转换表达式进行互转.
但对于集合类的类型[]MyString2与[]string来说这样做却是不合法的,因为[]MyString2与[]string的潜在类型不同,分别是MyString2和string。