第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

斯特里康夫Itoa 不接受 int64 類型的值

斯特里康夫Itoa 不接受 int64 類型的值

Go
繁星點(diǎn)點(diǎn)滴滴 2022-09-26 17:24:14
我正在學(xué)習(xí)使用 Go 創(chuàng)建 REST API。這就是我被困住的地方。當(dāng)用戶發(fā)送創(chuàng)建請(qǐng)求時(shí):從文章的片段中,我需要采取最后一篇文章將 ID(原字符串)轉(zhuǎn)換為整數(shù)遞增整數(shù)并將其轉(zhuǎn)換回字符串并保存文章結(jié)構(gòu)type Article struct {    Id       string  `json:"id"`    Title    string  `json:"title"`    Desc     string  `json:"desc"`    Content  string  `json:"content"`}邏輯如下// get the last id and convert it to integer and increment    lastId, err := strconv.ParseInt(Articles[len(Articles) - 1].Id, 10, 64)    lastId = lastId + 1     if err != nil {        http.Error(w, "Internal Server Error", http.StatusInternalServerError)    }    response := []Article{        {            Id: strconv.Itoa(lastId),// ?? ERROR            Title:   articleBody.Title,            Desc:    articleBody.Desc,            Content: articleBody.Content,        },    }錯(cuò)誤cannot use lastId (variable of type int64) as int value in argument to strconv.Itoa compiler (IncompatibleAssign)
查看完整描述

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,

            },

 }


查看完整回答
反對(duì) 回復(fù) 2022-09-26
?
不負(fù)相思意

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個(gè)贊

語言規(guī)范

uint大小
為 32 位或 64 位intuint

這意味著,在特定平臺(tái)/版本的 Go 上,Go 的大小可能與 相同,這就是 Go 不會(huì)靜默地允許您將 type 的值作為 type 的參數(shù)傳遞的原因。intint32int64int

此外,另一個(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)intlastId

在整數(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使用最大的方便類型。格式。


查看完整回答
反對(duì) 回復(fù) 2022-09-26
  • 2 回答
  • 0 關(guān)注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)