加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Golang中将int32转换为字符串

发布时间:2020-12-16 19:26:05 所属栏目:大数据 来源:网络整理
导读:我需要在Golang中将int32转换为字符串.是否可以在Golang中将int32转换为字符串而不先转换为int或int64? Itoa需要一个int. FormatInt需要一个int64. 一行答案是fmt.Sprint(i). 无论如何,有许多转换,甚至在标准库函数内部,如fmt.Sprint(i),所以你有一些选项(
我需要在Golang中将int32转换为字符串.是否可以在Golang中将int32转换为字符串而不先转换为int或int64?

Itoa需要一个int. FormatInt需要一个int64.

一行答案是fmt.Sprint(i).

无论如何,有许多转换,甚至在标准库函数内部,如fmt.Sprint(i),所以你有一些选项(尝试The Go Playground):

1-您可以编写转换函数(最快):

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-你可以使用fmt.Sprint(i)(慢)
见里面:

// 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-您可以使用strconv.Itoa(int(i))(快速)
见里面:

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

4-你可以使用strconv.FormatInt(int64(i),10)(更快)
见里面:

// 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
}

比较&基准测试(具有50000000次迭代):

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

码:

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/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:])
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读