【问题标题】:Booleans always false when Putting entities in Google App Engine datastore - Golang将实体放入 Google App Engine 数据存储区时,布尔值始终为 false - Golang
【发布时间】:2012-07-24 21:52:49
【问题描述】:

由于某种原因,当我尝试在 Google Apps 数据存储中存储布尔数据时,它总是存储为 false。

我的实体定义如下所示:

type Link struct {
  Name          string    //Coloquial label for link. Set by original User.
  ...
  isOpen        bool      //Tells us whether anyone can rewrite the link. Set by original User.
  isPerminant   bool      //Tells us whether link should be saved forever.
  isFlagged     bool      //Tells us whether the content has ever been flagged inappropriate.
}

我创建一个对象并像这样分配值:

//Create Link from form data
l   := Link{
  Name:         r.FormValue("name"),
  ...
  isOpen:       r.FormValue("open")=="on",        
  isPerminant:  r.FormValue("perminant")=="on",
  isFlagged:    r.FormValue("flagged")=="on",
}

我通过运行以下命令来验证数据:

//Put the Link in the datastore
lKey, err := datastore.Put(c, datastore.NewIncompleteKey(c, "Link", nil), &l)
if err != nil {
  http.Error(w, err.Error(), http.StatusInternalServerError)
  return
}

var newLink Link
if err = datastore.Get(c, lKey, &newLink); err != nil {
  http.Error(w, err.Error(), http.StatusInternalServerError)
  return
}

newLink output value: {[name] ... false false false}

即使我为其中一个 is[...] 属性硬编码为真值,它们仍然是假的! WHHHHHYYYY???

【问题讨论】:

  • 实体在数据存储区管理员http://localhost:8080/_ah/admin/datastore中是否正确显示?
  • 主要是。我看到了我输入的所有其他值;它们显示正确。我根本看不到任何布尔值。

标签: google-app-engine google-cloud-datastore go


【解决方案1】:

尝试将Is中的I大写:

type Link struct {
    Name        string //Coloquial label for link. Set by original User.
    IsOpen      bool   //Tells us whether anyone can rewrite the link. Set by original User.
    IsPerminant bool   //Tells us whether link should be saved forever.
    IsFlagged   bool   //Tells us whether the content has ever been flagged inappropriate.
}

.

//Create Link from form data
l := Link{
    Name:        r.FormValue("name"),
    IsOpen:      r.FormValue("open") == "on",
    IsPerminant: r.FormValue("perminant") == "on",
    IsFlagged:   r.FormValue("flagged") == "on",
}

对于要保存到数据存储的字段,必须将其导出。 IE。以大写字母开头。更多信息请阅读Effective Go的名称部分

【讨论】:

  • @SpencerConnaughton Go 使用大写来表示导出(公共)与非导出(私有)方法/属性。我找不到 AEGo 文档中在哪里/是否提到了这一点。 Effective GoNames 部分中提到了它。一开始可能会有点混乱,但一旦你了解了发生了什么,它确实会简化事情。
【解决方案2】:

您是否在硬编码对象后使用 put 方法?为了安全起见,请确保您所做的任何更改都跟在 put 之后。

【讨论】:

  • Put 是我做的最后一件事。如果我检查所有表单框并检查“l”对象,它显示全部为真。然后我调用 put,然后调用 get,它显示它们存储为全部 false。
猜你喜欢
  • 2010-12-03
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
相关资源
最近更新 更多