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 关注
- 268 浏览
添加回答
举报