2 回答

TA貢獻1829條經驗 獲得超7個贊
Contact.ID
類型為xid.ID
,它是一個字節數組:
type?ID?[rawLen]byte
string
因此,您提供的使用文字指定字段值的插入代碼ID
將是編譯時錯誤:
_, _ = contactCollection.InsertOne(context.TODO(), Contact{
? ? ID: "abcdefg",
? ? SurName: "Demo",
? ? PreName: "on stackoverflow",
})
后來在您的評論中,您澄清了上面的插入代碼只是一個示例,而不是您實際的操作方式。在您的真實代碼中,您從請求中解組聯系人(或其 ID 字段)。
xid.ID
有其自己的解組邏輯,這可能會以不同的方式解釋輸入數據,并可能導致 ID 表示string
與您的輸入不同的值。ID.UnmarshalJSON()
定義string
ID 如何轉換為xid.ID
:
func (id *ID) UnmarshalJSON(b []byte) error {
? ? s := string(b)
? ? if s == "null" {
? ? ? ? *id = nilID
? ? ? ? return nil
? ? }
? ? return id.UnmarshalText(b[1 : len(b)-1])
}
正如您所看到的,第一個字節被截斷,并且ID.UnmarshalText()
對其進行了更多“魔法”(如果您感興趣,請檢查源代碼)。
總而言之,為了避免在您不知情的情況下在后臺發生此類“轉換”,請string
為您的 ID 使用簡單的類型,并在需要存儲/傳輸您的 ID 的任何地方自行進行必要的轉換。

TA貢獻1776條經驗 獲得超12個贊
對于 ID 字段,您應該使用primitive.ObjectIDbson 包提供的。
"go.mongodb.org/mongo-driver/bson/primitive"
ID primitive.ObjectID `json:"_id" bson:"_id"`
- 2 回答
- 0 關注
- 347 瀏覽
添加回答
舉報