golang string转int8_Golang 中整数转字符串的方法

  • Post author:
  • Post category:golang

整形转字符串经常会用到,本文讨论一下 Golang 提供的这几种方法。基于 go1.10.1

fmt.Sprintf

fmt 包应该是最常见的了,从刚开始学习 Golang 就接触到了,写 ‘hello, world’ 就得用它。它还支持格式化变量转为字符串。

?

%d 代表十进制整数。

strconv.Itoa

?

strconv.FormatInt

?

参数 i 是要被转换的整数, base 是进制,例如2进制,支持2到36进制。

?

Format 的实现

[0, 99)的两位整数

对于小的(小于等于100)十进制正整数有加速优化算法:

?

加速的原理是提前算好100以内非负整数转换后的字符串。

?

可以看出来,转换后的结果是从1到99都有,而且每个结果只占两位。当然个人数的情况还得特殊处理,个位数结果只有一位。

?

如果被转换的数字是个位数,那么偏移量变成了1,默认情况是0。

只支持2到36进制的转换。36进制是10个数字加26个小写字母,超过这个范围无法计算。

?

整形最大64位,加一位是因为有个符号。转换计算时,要分10进制和非10进制的情况。

10进制转换

10进制里,两位两位转换,为什么这么干?两位数字时100以内非负整数转换可以用上面的特殊情况加速。很有意思。

?

2、4、8、16、32进制的转换。

?

通过循环求余实现。进制的转换也是这种方式。

?

上面的代码实现了进制的转换。而 digits[uint(u)&m] 实现了转换后的结果再转成字符。

常规情况

?

依然是循环求余来实现。这段代码更像是给人看的。和上面2的倍数的进制转换的区别在于,上面的代码把除法 / 换成了右移( >> ) s 位,把求余 % 换成了逻辑与 & 操作。

Sprintf 的实现

?

判断类型,如果是整数 int 类型,不需要反射,直接计算。支持的都是基础类型,其它类型只能通过反射实现。

Sprintf 支持的进制只有10 %d 、16 x 、8 o 、2 b 这四种,其它的会包 fmt: unknown base; can’t happen 异常。

?

2、8、16进制和之前 FormatInt 差不多,而10进制的性能差一些,每次只能处理一位数字,而不像 FormatInt 一次处理两位。

性能对比

?

压测有三组对比,小于100的情况,大数字的情况,还有二进制的情况。

?

Sprintf 在所有情况中都是最差的,还是别用这个包了。

小于100的情况会有加速,不光是性能上的加速,因为结果是提前算好的,也不需要申请内存。

FormatInt 10进制性能最好,其它的情况差一个数量级。

Itoa 虽然只是封装了 FormatInt ,对于性能还是有一些影响的。

本文涉及的代码可以从 这里 下载。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.cyeam.com/golang/2018/06/20/go-itoa


版权声明:本文为weixin_39783149原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。