如何在Go编程语言的Google App Engine上实现一对多

type Comment struct {
    Author  string
    Content string
    Date    datastore.Time
}

type Vote struct {
    User string
    Score int
}

推荐答案

Go AppEngine SDK当前版本中允许的字段类型只有as follows:

  • 带符号整数(int、int8、int16、int32和int64),
  • 布尔,
  • 字符串,
  • Float32和Float64,
  • 底层类型是上述预声明类型之一的任何类型,
  • * keys ,
  • 阿彭金.布洛基,
  • []字节(最大长度为1兆字节),
  • 上述任意一种元素的切片(长度不超过100个元素).

鉴于此,似乎有两种方法可以做到这一点.一种是维护一段关键字,以指向给定 comments 的投票.然而,这很可能会违反任何相当流行的 comments 的100个元素的限制.

另一种方法是在每个投票 struct 中存储指向注释的"指针",如下所示:

type Vote struct {
    User string
    Score int
    CommentKey *datastore.Key
}    

type Comment struct {
    Author  string
    Content string
    Date    datastore.Time
}

然后,当你go 查询它时,你需要分两步进行.首先,你会得到你感兴趣的 comments (在本例中,只是第一条碰巧被返回的 comments ).其次,查询所有"指向"该 comments 的投票:

q := datastore.NewQuery("Comment").Limit(1)
comments := make([]Comment, 0, 1)
var err os.Error
var keys []*datastore.Key
if keys, err = q.GetAll(c, &comments); err != nil {
    // handle the error
}

comment := comments[0]
vq := datastore.NewQuery("Vote").Filter("CommentKey=", keys[0])

votes := make([]Vote, 0, 10)
if _, err := vq.GetAll(c, &votes); err != nil {
    // handle the error
}

Go相关问答推荐

golang父进程的副本无法进行https/tls调用并获得tls:未能验证证书""

如何在另一个文件夹中使用Delve运行二进制文件?

如何用Golang解码这个嵌套的json?

可以';t从主机连接到ScyllaDB容器

确定果朗CSV行中的字节数

文件路径.Abs()未在结果中提供子目录

go mod tidy会自动升级go.mod中的go版本吗?

这是go语言gin提供的关于TypeEngine和RouterGroup的问题

Golang和Gin web框架在router.Run()之后执行代码

如何为ANTLR4目标Go调试监听器

如何从 Go Lambda 函数返回 HTML?

在 Windows 11 上运行 go mod tidy 时的 gitlab 权限问题

如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf struct ?

命令行参数在 Golang 程序中不正确地接受为参数

当我的 go build 成功时,如何修复我的 docker build 失败? Dockerfile 包括 go mod 下载

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

Golang ACMEv2 HTTP-01 挑战不挑战服务器

传递上下文的最佳方式

如何将实际上是类型为 reflect.Int32 的类型切片的 interface{} 转换为 int32 的切片?

在 Go 中表达函数的更好方法( struct 方法)