【问题标题】:GoLang App Engine Struct NameGoLang App Engine 结构名称
【发布时间】:2015-10-31 23:50:26
【问题描述】:

我最近在玩 AppEngine,遇到了以下代码的问题,其中似乎写入数据存储区的唯一值是日期。我花了一段时间在这个问题上敲了敲,发现通过简单地将结构中的第一个字符大写来修复它!

我想知道是否有其他人遇到过这个问题并知道为什么我无法在数据存储区的 Golang 结构中使用小写成员名称?我认为这可能是 Google AppEngine 处理结构写入方式的错误。

问题代码如下:

package main

import (
    "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
    }
    e2 := storeVals[0]
    fmt.Fprintf(w, "successfully grabbed {firstName: '%s', lastName: '%s', email: '%s', password: '%s', uaprem: '%s'}", e2.firstName, e2.lastName, e2.email, e2.password)
}

【问题讨论】:

  • 也许这些字段必须导出?仅导出大写的结构字段。 Exported identifiers
  • 我认为这仅适用于您希望导出标识符的情况,在这种情况下我不太关心。我只是在这个包内部使用它们。
  • Datastore Entity Doc 创建实体部分中声明只有导出的字段才会保存到数据存储区。

标签: google-app-engine struct go


【解决方案1】:

这与Go如何处理“公共”和“私有”概念有关。

要导出,您确实需要大写的字段名称。 This 可以帮助解释...它与 JSON 有关,但它适用于这里,因为这两种情况都需要从结构中导出数据。

这是来自Eager blog post on Go and JSON,我觉得很有帮助:

字段名称

您可能知道,Go 要求所有导出的字段都以 大写字母。 然而,在 JSON 中使用这种样式并不常见。 我们使用标签让解析器知道在哪里实际查找 价值。

您可以在上面的示例中看到一个示例,但作为 复习一下它的样子:

type MyStruct struct {
    SomeField string `json:"some_field"`
}

【讨论】:

    猜你喜欢
    • 2012-09-30
    • 2015-11-22
    • 1970-01-01
    • 2010-09-08
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多