2 回答
TA贡献1883条经验 获得超3个赞
Go 有一个强大的类型系统,因此 Int32 和 Int64 不是兼容的类型。尝试在调用 Itoa 时转换为:lastIdint
response := []Article{
{
Id: strconv.Itoa(int(lastId)),
Title: articleBody.Title,
Desc: articleBody.Desc,
Content: articleBody.Content,
},
}
编辑:正如@kostix在他的答案中提到的,在转换int类型时要小心溢出(有关详细信息,请参阅他的答案)。
更安全的解决方案是这样的:
newId := int(lastId)
if int64(newId) != lastId {
panic("overflows!")
}
response := []Article{
{
Id: strconv.Itoa(newId),
Title: articleBody.Title,
Desc: articleBody.Desc,
Content: articleBody.Content,
},
}
TA贡献1777条经验 获得超10个赞
语言规范说:
uint
大小
为 32 位或 64 位int
uint
这意味着,在特定平台/版本的 Go 上,Go 的大小可能与 相同,这就是 Go 不会静默地允许您将 type 的值作为 type 的参数传递的原因。int
int32
int64
int
此外,另一个答案中建议的普通类型转换应该谨慎对待:当你的程序被编译并最终在编译的代码中具有32位大小时会发生什么,并且特定值超出了有符号的32位整数支持的数字范围,例如2,147,483,648?
同样,规范说:int(lastId)
int
lastId
在整数类型之间转换时,如果值为有符号整数,则符号扩展到隐式无限精度;否则,它是零扩展。然后将其截断以适合结果类型的大小。例如,如果 ,则 .转换始终产生有效值;没有溢出的迹象。
v := uint16(0x10F0)
uint32(int8(v)) == 0xFFFFFFF0
因此,代码
var i64 int64 = 2_147_483_648
var i32 = int32(i64)
fmt.Println(i32)
指纹
-2147483648
当此值传递给 时,它将返回“-2147483648” - 很可能不是您所期望的。strconv.Itoa
因此,在健壮的代码中,在执行此类类型转换时应注意,并检查转换后的值是否健全,例如
v := int(lastId)
if int64(v) != lastId {
panic("ouch!")
}
或者仅仅通过strconv使用最大的方便类型。格式。
- 2 回答
- 0 关注
- 122 浏览
添加回答
举报