我在Go应用中使用Google的数据存储区。我有一个Song
结构,它有一个uuid.UUID
字段。
type Song struct {
ID: uuid.UUID
Title: string
...
}
此UUID
取自github.com/satori/go.uuid,定义为
type UUID [16]byte
似乎数据存储区无法处理字节数组,但在此用例中只能处理字节切片或字符串。在json
包中,我可以使用标记将其解释为字符串
type Song struct {
ID: uuid.UUID `json:"id,string"`
....
}
有没有办法让数据存储区将UUID
解释为切片/字符串,或者我是否必须放弃“type”-safety并只存储字符串或使用自定义PropertyLoadSaver
?
答案 0 :(得分:3)
有效值类型为:
- 签名整数(int,int8,int16,int32和int64),
- BOOL,
- 串,
- float32和float64,
- [] byte(最长1 MB),
- 其基础类型为上述预先声明类型之一的任何类型
- 字节字符串,
- *键,
- time.Time(以微秒精度存储),
- appengine.BlobKey,
- appengine.GeoPoint,
- 其字段都是有效值类型的结构
- 上述任何一种切片。
因此,您必须使用字节切片或字符串。当你需要进行设置或变得喜欢时,你可以做一些幕后操作(Playground Example):
type uuid [16]byte
type song struct {
u []byte
}
func main() {
var b [16]byte
copy(b[:], "0123456789012345")
var u uuid = uuid(b) //this would represent when you get the uuid
s := song{u: []byte(u[:])}
copy(b[:], s.u)
u = uuid(b)
fmt.Println(u)
}
这也可以通过方法来完成。 (Playground example)
或者,您可以拥有一个特定于数据存储区的实体来承载字节切片,以及来往该实体的变换器知道如何进行转换。