有时需要将一个类型转换为另一个类型。在 Go 中可以做到,当然有一些特定规则。首先,将一个值转换为另一个是由操作符(看起来像是函数:byte())完成的,而并且不是所有的转换都是允许的。
从 string 到字节或者 rune 的 slice
1 | mystring := "hello this is string" |
转换到 byte slice,每个 byte 保存字符串对应字节的整数值。注意 Go 的字符串是 UTF-8 编码的,一些字符可能是 1、2、3 或者 4 个字节结尾。
转换到 rune slice,每个 rune 保存 Unicode 编码的指针。字符串中的每个字符对应一个整数。
从字节或者整形的 slice 到 string
1 | b := []byte {'h','e','l','l','o'} // 复合声明 |
对于数值,定义了下面的转换:
- 将整数转换到指定的(bit)长度:
uint8(int); - 从浮点数到整数:
int(float32)。这会截断浮点数的小数部分; - 其他的类似:
float32(int)。
用户定义类型的转换
如何在自定义类型之间进行转换?这里创建了两个类型 Foo 和 Bar,而 Bar 是 Foo 的一个别名:
1 | type foo struct { int } // 匿名字段 |
最后一行会引起错误:
1 | cannot use b (type bar) as type foo in assignment |
这可以通过转换来修复:
1 | var f foo = foo(b) |
注意转换那些字段不一致的结构是很困难的。同时,转换 b 到 int 同样会出错;整数与有整数字段的结构体并不是一样的。