Golang中类型转换


有时需要将一个类型转换为另一个类型。在 Go 中可以做到,当然有一些特定规则。首先,将一个值转换为另一个是由操作符(看起来像是函数:byte())完成的,而并且不是所有的转换都是允许的。

从 string 到字节或者 ruin 的 slice。

mystring := "hello this is string
byteslice := []byte(mystring)
runeslice := []rune(mystring)

转换到 byte slice,每个 byte 保存字符串对应字节的整数值。注意 Go 的字符串是 UTF-8 编码的,一些字符可能是 1、2、3 或者 4 个字节结尾。

转换到 rune slice,每个 rune 保存 Unicode 编码的指针。字符串中的每个字符对应一个整数。

从字节或者整形的 slice 到 string。

b := []byte {'h','e','l','l','o'} // 复合声明
s := string(b)
i := []rune {257,1024,65}
r := string(i)

对于数值,定义了下面的转换:
1、将整数转换到指定的(bit)长度:uint8(int);
2、从浮点数到整数:int(float32)。这会截断浮点数的小数部分;
3、其他的类似:float32(int)。
用户定义类型的转换
如何在自定义类型之间进行转换?这里创建了两个类型 Foo 和 Bar,而 Bar 是 Foo 的一个别名:

type foo struct { int } // 匿名字段
type bar foo // bar 是 foo 的别名
var b bar = bar{1} // 声明 b 为 bar 类型
var f foo = b // 赋值 b 到 f

最后一行会引起错误:
cannot use b (type bar) as type foo in assignment(不能使用 b(类型 bar)作为类型 foo 赋值)

这可以通过转换来修复:

var f foo = foo(b)

注意转换那些字段不一致的结构是很困难的。同时,转换 b 到 int 同样会出错;整数与有整数字段的结构体并不是一样的。


文章作者: RickDamon
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 RickDamon !
  目录