猿问

GoLang App Engine 结构名称

我最近在玩 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

    }



红颜莎娜
浏览 143回答 1
1回答

明月笑刀无情

这与 Go 如何处理“公共”和“私有”概念有关。要导出,您确实需要大写的字段名称。这可以帮助解释...它与 JSON 相关,但它适用于这里,因为这两种情况都需要从结构中导出数据。这是来自关于 Go 和 JSON的Eager 博客文章,我发现它很有帮助:字段名称您可能知道,Go 要求所有导出的字段以大写字母开头。然而,在 JSON 中使用这种样式并不常见。我们使用标签让解析器知道在哪里实际查找值。你可以在上面的例子中看到一个例子,但作为复习,它是这样的:type MyStruct struct {    SomeField string `json:"some_field"`}
随时随地看视频慕课网APP

相关分类

Go
我要回答