golang的数据类型转换是困惑新gopher的一大问题之一。相对于python,golang的数据类型转换可要麻烦的多,而且还不走寻常路地诞生了些新的方法跟名词。因此本文讲解golang常见数据类型string、int、rune等数据类型相互之间的转换方法,给大伙儿避坑。
在讲述方法之前,首先非常有必要讲下go源码对这些数据类型的表述:
1 | // string is the set of all strings of 8-bit bytes, conventionally but not |
从上面的描述我们可以获得以下信息:
int
有符号,至少32位,但并不是int32
的别称。如果把大于2147483647的数赋值int
,int
打出来也是正常的,没有损失精度rune
就是int32
,实际一般用来表示字符char
的值。和一般的char
不一样的是rune的精度比较高= =,并且golang也没有char
这个内置关键字byte
就是uint8
,实际一般用来表示二进制数据中比特的值
因此对于rune
、byte
这边,就可以当作uint8跟int32相关的转换了,这块的理解就容易得多
首先看字符串string
到int
、float
等数值的转换:
1 | func testStringToDigit() { |
string
到int
用strconv.Atoi
方法,而对于其它有bitSize限制的数据,则用strconv.ParseInt
或者strconv.ParseFloat
先转换成64位再调精度即可。
然后看数值到string
的转换:
1 | func testDigitToString() { |
数值到string
,最简单粗暴的方法是fmt.Sprintf
格式化字符串。如果需要精调,则得用strconv.ParseInt
、strconv.ParseFloat
等方式。值得一提的是strconv.ParseFloat
注释了多种格式可供选择,有兴趣的同学可以看源码。
string
和rune
、byte
之类数据的转换,可以如下:
1 | func testStringAndRuneAndByte() { |
用[]rune
、[]byte
可直接将string
变为charArray
。值得一提的是,遍历string
时每个char
字符的类型为int32
,可用rune
表示;字符表达式'h'
可以直接和rune
、byte
类型数字用==
比较。
然后,由于rune
、byte
本身就是int
系,所以这两个和int
系类型间的转换会非常简单
1 | func testIntAndRuneAndByte() { |
最后一个tips是通用数据类型interface{}
转特定数据格式的方法,可以这样操作:
1 | func testInterfaceToInt() { |
注意interface{}
赋值了个int
,如果直接带后缀.(int32)
这样指定其它数据类型,会直接报错