【问题标题】:AppEngine Datastore: byte slice vs datastore.ByteStringAppEngine Datastore:字节切片与 datastore.ByteString
【发布时间】:2016-08-15 12:47:04
【问题描述】:
我需要一个具有短字节序列的属性,但我不需要该属性的索引。 datastore.ByteString 属性类型用于短字节序列并被索引,而普通的[]byte 属性用于更长的字节序列并且不被索引。
我不得不使用[]byte,因为我不需要索引,它会为我节省额外的写入成本,但我使用datastore.ByteString 是否更好,因为它适用于短值?这样做有什么好处吗?
【问题讨论】:
标签:
google-app-engine
go
google-cloud-datastore
【解决方案1】:
datastore.ByteString 类型实际上只是一个普通的[]byte 切片,请参阅它的声明:
type ByteString []byte
不同之处在于,如果您有ByteString 类型的属性,AppEngine 将默认尝试对其进行索引。由于数据存储索引整体的长度有限,ByteString 值的长度最多只能为 1500 字节才能被索引。
ByteString 也没有任何额外的方法可以增加除了可索引性之外的一些好处。
如果您不打算为您的资源编制索引,只需使用[]byte。如果您打算索引它,因为您想搜索/过滤它,那么您必须使用ByteString。例如,如果您想存储某些内容(例如文件)的哈希值,并且您想根据其内容哈希值搜索文件,这将很有用。在这种情况下,ByteString 非常有意义并且最紧凑(与将哈希存储为 string 作为十六进制表示的替代方案相比)。
请注意,即使您使用ByteString,您仍然可以使用tags 使属性未编入索引,例如:
type MyEntity struct {
Something datastore.ByteString `datastore:"something,noindex"`
}