我最近在玩 AppEngine 并遇到以下代码的问题,其中似乎写入数据存储的唯一值是日期。我花了一段时间对此感到震惊,发现只需将结构中的第一个字符大写即可修复它!我想知道是否还有其他人遇到过这个问题并且知道为什么我无法在 Golang 结构中为数据存储使用小写成员名称?我认为这可能是 Google AppEngine 处理结构写入方式的错误。这是问题代码:package mainimport ( "fmt" "net/http" "time" "appengine" "appengine/datastore")/* This is the problem struct */type storeVal struct { firstName string //FirstName works lastName string //LastName works email string //Email works password string //Password works Date time.Time}func init() { http.HandleFunc("/", handle) http.ListenAndServe(":8080", nil)}func handle(w http.ResponseWriter, r *http.Request) { c := appengine.NewContext(r) /* Write values to DataStore */ e1 := storeVal{ firstName: "Bob", //FirstName works lastName: "Smith", //lastName works email: "bob.smith@test.com", //Email works password: "password!", //Password works Date: time.Now(), } key := datastore.NewIncompleteKey(c, "storeVal", nil) _, err := datastore.Put(c, key, &e1) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } fmt.Fprintf(w, "successfully added {firstName: '%s', lastName: '%s', email: '%s', password: '%s'}", e1.firstName, e1.lastName, e1.email, e1.password) /* Read values back in. */ q := datastore.NewQuery("storeVal"). Filter("firstName =", "Bob"). Filter("lastName =", "Smith"). Order("-Date") var storeVals []storeVal _, err2 := q.GetAll(c, &storeVals) if err2 != nil { http.Error(w, err2.Error(), http.StatusInternalServerError) return } if (len(storeVals) == 0) { fmt.Printf("No results."); return }
1 回答
明月笑刀无情
TA贡献1828条经验 获得超4个赞
这与 Go 如何处理“公共”和“私有”概念有关。
要导出,您确实需要大写的字段名称。这可以帮助解释...它与 JSON 相关,但它适用于这里,因为这两种情况都需要从结构中导出数据。
这是来自关于 Go 和 JSON的Eager 博客文章,我发现它很有帮助:
字段名称
您可能知道,Go 要求所有导出的字段以大写字母开头。然而,在 JSON 中使用这种样式并不常见。我们使用标签让解析器知道在哪里实际查找值。
你可以在上面的例子中看到一个例子,但作为复习,它是这样的:
type MyStruct struct {
SomeField string `json:"some_field"`
}
- 1 回答
- 0 关注
- 142 浏览
添加回答
举报
0/150
提交
取消