Convert int32 to string in Golang

前端 未结 3 1573
無奈伤痛
無奈伤痛 2020-12-25 12:30

I need to convert an int32 to string in Golang. Is it possible to convert int32 to string in Golang without converting to

3条回答
  •  半阙折子戏
    2020-12-25 13:00

    One line answer is fmt.Sprint(i).

    Anyway there are many conversions, even inside standard library function like fmt.Sprint(i), so you have some options (try The Go Playground):


    1- You may write your conversion function (Fastest):

    func String(n int32) string {
        buf := [11]byte{}
        pos := len(buf)
        i := int64(n)
        signed := i < 0
        if signed {
            i = -i
        }
        for {
            pos--
            buf[pos], i = '0'+byte(i%10), i/10
            if i == 0 {
                if signed {
                    pos--
                    buf[pos] = '-'
                }
                return string(buf[pos:])
            }
        }
    }
    

    2- You may use fmt.Sprint(i) (Slow)
    See inside:

    // Sprint formats using the default formats for its operands and returns the resulting string.
    // Spaces are added between operands when neither is a string.
    func Sprint(a ...interface{}) string {
        p := newPrinter()
        p.doPrint(a)
        s := string(p.buf)
        p.free()
        return s
    }
    

    3- You may use strconv.Itoa(int(i)) (Fast)
    See inside:

    // Itoa is shorthand for FormatInt(int64(i), 10).
    func Itoa(i int) string {
        return FormatInt(int64(i), 10)
    }
    

    4- You may use strconv.FormatInt(int64(i), 10) (Faster)
    See inside:

    // FormatInt returns the string representation of i in the given base,
    // for 2 <= base <= 36. The result uses the lower-case letters 'a' to 'z'
    // for digit values >= 10.
    func FormatInt(i int64, base int) string {
        _, s := formatBits(nil, uint64(i), base, i < 0, false)
        return s
    }
    

    Comparison & Benchmark (with 50000000 iterations):

    s = String(i)                       takes:  5.5923198s
    s = String2(i)                      takes:  5.5923199s
    s = strconv.FormatInt(int64(i), 10) takes:  5.9133382s
    s = strconv.Itoa(int(i))            takes:  5.9763418s
    s = fmt.Sprint(i)                   takes: 13.5697761s
    

    Code:

    package main
    
    import (
        "fmt"
        //"strconv"
        "time"
    )
    
    func main() {
        var s string
        i := int32(-2147483648)
        t := time.Now()
        for j := 0; j < 50000000; j++ {
            s = String(i) //5.5923198s
            //s = String2(i) //5.5923199s
            //s = strconv.FormatInt(int64(i), 10) // 5.9133382s
            //s = strconv.Itoa(int(i)) //5.9763418s
            //s = fmt.Sprint(i) // 13.5697761s
        }
        fmt.Println(time.Since(t))
        fmt.Println(s)
    }
    
    func String(n int32) string {
        buf := [11]byte{}
        pos := len(buf)
        i := int64(n)
        signed := i < 0
        if signed {
            i = -i
        }
        for {
            pos--
            buf[pos], i = '0'+byte(i%10), i/10
            if i == 0 {
                if signed {
                    pos--
                    buf[pos] = '-'
                }
                return string(buf[pos:])
            }
        }
    }
    
    func String2(n int32) string {
        buf := [11]byte{}
        pos := len(buf)
        i, q := int64(n), int64(0)
        signed := i < 0
        if signed {
            i = -i
        }
        for {
            pos--
            q = i / 10
            buf[pos], i = '0'+byte(i-10*q), q
            if i == 0 {
                if signed {
                    pos--
                    buf[pos] = '-'
                }
                return string(buf[pos:])
            }
        }
    }
    

提交回复
热议问题