go源码阅读 实现itoa()

2年前 (2022) 程序员胖胖胖虎阿
293 0 0

一、简介

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:])
}
版权声明:程序员胖胖胖虎阿 发表于 2022年9月12日 下午6:56。
转载请注明:go源码阅读 实现itoa() | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...