2 回答

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
Go 有一個(gè)強(qiáng)大的類型系統(tǒng),因此 Int32 和 Int64 不是兼容的類型。嘗試在調(diào)用 Itoa 時(shí)轉(zhuǎn)換為:lastIdint
response := []Article{
{
Id: strconv.Itoa(int(lastId)),
Title: articleBody.Title,
Desc: articleBody.Desc,
Content: articleBody.Content,
},
}
編輯:正如@kostix在他的答案中提到的,在轉(zhuǎn)換int類型時(shí)要小心溢出(有關(guān)詳細(xì)信息,請(qǐng)參閱他的答案)。
更安全的解決方案是這樣的:
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貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊
語言規(guī)范說:
uint
大小
為 32 位或 64 位int
uint
這意味著,在特定平臺(tái)/版本的 Go 上,Go 的大小可能與 相同,這就是 Go 不會(huì)靜默地允許您將 type 的值作為 type 的參數(shù)傳遞的原因。int
int32
int64
int
此外,另一個(gè)答案中建議的普通類型轉(zhuǎn)換應(yīng)該謹(jǐn)慎對(duì)待:當(dāng)你的程序被編譯并最終在編譯的代碼中具有32位大小時(shí)會(huì)發(fā)生什么,并且特定值超出了有符號(hào)的32位整數(shù)支持的數(shù)字范圍,例如2,147,483,648?
同樣,規(guī)范說:int(lastId)
int
lastId
在整數(shù)類型之間轉(zhuǎn)換時(shí),如果值為有符號(hào)整數(shù),則符號(hào)擴(kuò)展到隱式無限精度;否則,它是零擴(kuò)展。然后將其截?cái)嘁赃m合結(jié)果類型的大小。例如,如果 ,則 .轉(zhuǎn)換始終產(chǎn)生有效值;沒有溢出的跡象。
v := uint16(0x10F0)
uint32(int8(v)) == 0xFFFFFFF0
因此,代碼
var i64 int64 = 2_147_483_648
var i32 = int32(i64)
fmt.Println(i32)
指紋
-2147483648
當(dāng)此值傳遞給 時(shí),它將返回“-2147483648” - 很可能不是您所期望的。strconv.Itoa
因此,在健壯的代碼中,在執(zhí)行此類類型轉(zhuǎn)換時(shí)應(yīng)注意,并檢查轉(zhuǎn)換后的值是否健全,例如
v := int(lastId)
if int64(v) != lastId {
panic("ouch!")
}
或者僅僅通過strconv使用最大的方便類型。格式。
- 2 回答
- 0 關(guān)注
- 151 瀏覽
添加回答
舉報(bào)