我是Go的新手,到目前为止,我很喜欢它。但是,我无法解决这个问题。
我有一个简单的包裹,发票。
type Invoice struct {
key datastore.Key
Name string
Created time.Time
Updated time.Time
lineItems []LineItem
}
发票有几个LineItem。
type LineItem struct {
key datastore.Key
InvoiceKey *datastore.Key
Name string
Description string
}
我的包有几个功能。
func New(c appengine.Context) (i Invoice)
func (i *Invoice) Update()
func (i *Invoice) Save(c appengine.Context)
func (i *Invoice) AddLineItem(c appengine.Context, name string)
New()返回一个新的Invoice,并将Invoice内的datastore.NewIncompleteKey()生成的密钥保存为未导出的变量,以便我以后保存。
所有这些都运行良好,无论是否正确的方式这样做是另一个问题。我也对此发表评论。我似乎无法弄清楚的是最后一个功能。
func (i *Invoice) AddLineItem(c appengine.Context, name string) {
key := datastore.NewIncompleteKey(c, "LineItem", &i.key)
lineItem := LineItem{key: *key, InvoiceKey: &i.key, Name: name}
i.lineItems = append(i.lineItems, lineItem)
}
在Save()
中for _, lineItem := range i.lineItems {
_, err := datastore.Put(c, &lineItem.key, &lineItem)
if err != nil {
panic(err)
}
}
我这里一直收到无效的密钥错误。我基本上只是想让发票有能力拥有许多LineItems。能够将它们全部保存到数据存储区,然后根据需要将所有LineItem拉出整个Invoice。
我是否在正确的轨道上?有更好的方法吗?
答案 0 :(得分:0)
您的lineItems []LineItem
和key datastore.Key
未被导出,他们需要以大写字母开头,否则GAE将无法使用它。
来自specs:
可以导出标识符以允许从另一个包访问它。如果两者都导出标识符:
- 标识符名称的第一个字符是Unicode大写字母(Unicode类" Lu");和
- 标识符在包块中声明,或者是字段名称或方法名称。
醇>不会导出所有其他标识符。
答案 1 :(得分:0)
请勿使用datastore.Key
,而是使用*datastore.Key
。任何时候你认为它可能没有被设置是一个bug的来源,并且可能会把你的无效密钥错误变成恐慌。
您正在为LineItem
个密钥提供父级(Invoice
),这很好,但为什么除了Invoice
密钥之外还存储LineItem
密钥?你可以通过调用后者的Parent方法来获得前者。
答案 2 :(得分:0)
我遇到的问题是尝试使用不完整的发票密钥来生成不完整的LineItem密钥。
key, err := datastore.Put(c, &i.key, i)
使用put中返回的完整密钥。
for _, lineItem := range i.lineItems {
key := datastore.NewIncompleteKey(c, "LineItem", key)
lineItem.InvoiceKey = k
_, err := datastore.Put(c, key, &lineItem)
if err != nil {
panic(err)
}
}
存储它们。现在的任务是弄清楚如何从数据存储中读取它们!祝我好运。