我需要将uint32转换为字符串。我怎样才能做到这一点 。 strconv.Itoa似乎不起作用。
长店:
我需要将通过imap包接收的UID转换为字符串,以便稍后可以将其设置为序列。作为旁注,我想知道为什么Go中的这种转换很困难。演员string(t)
本来可以这么容易
答案 0 :(得分:36)
我会使用strconv.FormatUint
执行此操作:
import "strconv"
var u uint32 = 17
var s = strconv.FormatUint(uint64(u), 10)
// "17"
请注意,预期参数为uint64
,因此您必须首先投射uint32
。没有特定的FormatUint32
功能。
答案 1 :(得分:33)
我会简单地使用Sprintf,甚至只使用Sprint:
var n uint32 = 42
str := fmt.Sprint(n)
println(str)
Go是强类型的。直接将数字转换为字符串是没有意义的。考虑C,其中string是char *
,它是指向由\0
终止的字符串的第一个字母的指针。将数字转换为字符串会导致第一个字母指向数字的地址,这没有意义。这就是为什么你需要积极地"转换。
答案 2 :(得分:0)
总结:
strconv.Itoa似乎不起作用
strconv.Itoa
接受int
,它是有符号整数(32位或64位),与体系结构相关的类型(请参见Numeric types)。
我需要将uint32转换为字符串
更好的选项为strconv.FormatUint
,因为它速度更快,内存分配更少(基准示例here或here)。
强制转换字符串(t)可能要容易得多。
使用string
不能像某些人期望的那样工作,请参阅spec:
将有符号或无符号整数值转换为字符串类型会产生一个包含整数的UTF-8表示形式的字符串。有效Unicode代码点范围之外的值将转换为“ \ uFFFD”。
该功能将从Go2中删除,请参见Rob Pike的proposal
答案 3 :(得分:0)
要获得更强大的解决方案,您可以使用 text/template
:
package main
import (
"text/template"
"strings"
)
func format(s string, v interface{}) string {
t, b := new(template.Template), new(strings.Builder)
template.Must(t.Parse(s)).Execute(b, v)
return b.String()
}
func main() {
imap := struct{UID uint32}{999}
s := format("{{.UID}}", imap)
println(s == "999")
}