乐趣区

关于go:go源码阅读-实现itoa

一、简介

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:])
}
退出移动版