共计 1002 个字符,预计需要花费 3 分钟才能阅读完成。
一、简介
itoa 全称是 int 桶 ascii
在 c 语言,go 语言等,都有原生的实现反对。
我在源码 src/os/str.go
发现了 go 的实现
// 简略的实现 itoa 防止再去调用 strconv.
package os
// Convert integer to decimal string
func itoa(val int) string {
if val < 0 {return "-" + uitoa(uint(-val))
}
return uitoa(uint(val))
}
// Convert unsigned integer to decimal string
func uitoa(val uint) string {
if val == 0 { // avoid string allocation
return "0"
}
var buf [20]byte // big enough for 64bit value base 10
i := len(buf) - 1
for val >= 10 {
q := val / 10
buf[i] = byte('0' + val - q*10)
i--
val = q
}
// val < 10
buf[i] = byte('0' + val)
return string(buf[i:])
}
二、源码浏览
1、辨别正负号
// 把 int 类型转化成 10 进制对应的 string
func itoa(val int) string {
if val < 0 {return "-" + uitoa(uint(-val))
}
return uitoa(uint(val))
}
先判断是否小于 0,来增加“-”负号
2、把 int 转成对应的 10 进制 string
2.1、如果整数 0 返回 ”0″
2.2、生成一个 int 对应的字符数组,比方 1234,变成 byte[‘1′,’2′,’3′,’4′,’5’]
2.3、把字符数组 byte[‘1′,’2′,’3′,’4′,’5’] 变成 string
// Convert unsigned integer to decimal string
func uitoa(val uint) string {
if val == 0 { // 如果整数 0 返回 "0"
return "0"
}
var buf [20]byte // big enough for 64bit value base 10
i := len(buf) - 1
for val >= 10 {
q := val / 10
buf[i] = byte('0' + val - q*10)
i--
val = q
}
// val < 10
buf[i] = byte('0' + val)
return string(buf[i:])
}
正文完