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)这样指定其它数据类型,会直接报错