无法在google的数据存储区中存储字节数组

时间:2017-04-21 18:44:41

标签: go google-cloud-datastore uuid

我在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

1 个答案:

答案 0 :(得分:3)

Google's Documentation

  

有效值类型为:

     
      
  • 签名整数(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

或者,您可以拥有一个特定于数据存储区的实体来承载字节切片,以及来往该实体的变换器知道如何进行转换。