我需要在Golang中将转换int32为string。是否有可能转换int32到string在Golang无须转换为int或int64第一?
int32
string
int
int64
Itoa需要一个int。FormatInt需要一个int64。
Itoa
FormatInt
一线的答案是fmt.Sprint(i)。
fmt.Sprint(i)
无论如何,甚至在标准库函数(例如)内部都有很多转换,fmt.Sprint(i)因此您有一些选择(尝试使用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)) ( 快速 ) 参见内部:
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)( 更快 ) 请参阅内部:
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 = '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:]) } } }