我需要在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:]) } } }