亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

編組空 map[string]interface{} 導致“null”而不是 nil

編組空 map[string]interface{} 導致“null”而不是 nil

Go
鴻蒙傳說 2021-10-18 10:09:37
如果我嘗試執行以下操作,Go 會在我的 PostgreSQL 數據庫的 jsonb 列中插入“null”,并且 structs 屬性(在這種情況下為 map[string]interface{} 類型)為空,則出現問題:accessMembers, _ := json.Marshal(c.AccessMembers)進行測試打印它輸出的值與存儲到數據庫中的值相同:fmt.Println(string(accessMembers)) // equals the string "null"問題是我需要它是 - nil(不是字符串,而是 Golang nil),所以當我在下面的 Exec 函數中使用它時:sqlStr := `UPDATE my_table SET access_members=$1 WHERE id=$2;`_, err := db.Exec(sqlStr, accessMembers, c.Id)它應該等效于(有效?。。篲, err := db.Exec(sqlStr, nil, c.Id)我嘗試了很多不同的解決方法,我認為這些方法必須有效,但它們沒有。例如。var accessMembers []byteam, _ := json.Marshal(c.AccessMembers)if string(am) != "null"{    accessMembers = am}sqlStr := `UPDATE my_table SET access_members=$1 WHERE id=$2;`_, err := db.Exec(sqlStr, accessMembers, c.Id)這會導致以下錯誤:“pq:json 類型的輸入語法無效”我不明白為什么這與在 Exec 函數參數中顯式寫入 nil 不同,因為 []byte 顯然必須為零,對嗎?我在這里做錯了什么?這是我希望它會起作用的方式:http : //play.golang.org/p/UoLAGfhhRl回答:var accessMembers interface{} = nilif c.AccessMembers != nil {    j, _ := json.Marshal(c.AccessMembers)    accessMembers = j}感謝 thwd 基本上提供了解決方案,并指出了數據庫驅動程序如何以不同的方式編組 nil,建議使用 interface{} 而不是 []byte。感謝DonSeba提醒我在使用資源編組之前檢查struct字段是否存在,進行字符串轉換和比較,這應該更昂貴。
查看完整描述

2 回答

?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

我不明白為什么這與在 Exec 函數參數中顯式寫入 nil 不同,因為 []byte 顯然必須為零,對嗎?


nil有一個類型。數據庫驅動程序nil對 typemap[string]interface{}或[]bytefor interface{} (這是 的第二個參數的類型)的封送方式不同db.Exec。你應該能夠做到:


var i interface{} = nil


j, _ := json.Marshal(c.AccessMembers)


if string(j) != "null" {

     i = j

}


sqlStr := `UPDATE content SET access_members=$1 WHERE id=$2;`


_, err := db.Exec(sqlStr, i, c.Id)


查看完整回答
反對 回復 2021-10-18
  • 2 回答
  • 0 關注
  • 266 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號