【发布时间】:2022-01-28 07:16:10
【问题描述】:
有类似的问题。但大多数情况下,他们使用 Hex()(如here)进行原始对象到字符串的转换。我正在使用 String() 进行转换。如何将其转换回原始对象类型?
【问题讨论】:
标签: string go casting type-conversion primitive
有类似的问题。但大多数情况下,他们使用 Hex()(如here)进行原始对象到字符串的转换。我正在使用 String() 进行转换。如何将其转换回原始对象类型?
【问题讨论】:
标签: string go casting type-conversion primitive
String() 类型的方法可能会导致任意字符串表示。解析它可能并不总是可能的,因为它可能不包含原始值所拥有的所有信息,或者它可能不会以可明确解析的方式“呈现”。也不能保证String() 的“输出”不会随着时间而改变。
ObjectID.String() 的当前实现是这样做的:
func (id ObjectID) String() string {
return fmt.Sprintf("ObjectID(%q)", id.Hex())
}
这会产生这样的字符串:
ObjectID("4af9f070cc10e263c8df915d")
这是可解析的,您只需获取十六进制数字,并将其传递给primitive.ObjectIDFromHex():
例如:
id := primitive.NewObjectID()
s := id.String()
fmt.Println(s)
hex := s[10:34]
id2, err := primitive.ObjectIDFromHex(hex)
fmt.Println(id2, err)
这将输出(在Go Playground 上尝试):
ObjectID("4af9f070cc10e263c8df915d")
ObjectID("4af9f070cc10e263c8df915d") <nil>
可以改进此解决方案以在字符串表示中查找 " 字符并使用索引而不是固定的 10 和 34,但您不应该在中传输和解析 ObjectID.String() 的结果第一名。您应该首先使用它的ObjectID.Hex() 方法,该方法可以按原样传递给primitive.ObjectIDFromHex()。
【讨论】: