数据存储区不会在Go中放置嵌套的结构

时间:2017-12-12 14:30:40

标签: go google-cloud-datastore

结构看起来像这样:

type Account struct {
  Username         string    // NameKey
  Password         []byte    `datastore:",noindex"`
  RegistrationTime time.Time `datastore:",noindex"`
  AppUser
}

type AppUser struct {
  LoginEntries []LoginEntry `datastore:",noindex"`
}

type LoginEntry struct {
  Timestamp time.Time `datastore:",noindex"`
  UserAgent string    `datastore:",noindex"`
  IP        string    `datastore:",noindex"`
}

我也确定我正确地放置了数据,因为其他数据没有更新问题,我在将fmt.Println保存到数据存储区之前尝试account Account内容Put(ctx, key, &account {{1} }}当我打印它然后我可以看到所有AppUser信息..但是当我稍后Get用户然后AppUser信息不存在(只显示为{[]})。

我很确定我之前在数据存储区中存储了嵌套的结构切片而没有任何问题,因此我对可能导致它的原因感到困惑。

Put func:

func PutAccount(ctx context.Context, acc Account) (*datastore.Key, error) {
  if isValidUsername(acc.Username) != true {
    return nil, errors.New("Invalid username.")
  }
  var hashedPassword []byte
  if acc.RegistrationTime.IsZero() {
    var err error
    hashedPassword, err = bcrypt.GenerateFromPassword(acc.Password, 12)
    if err != nil {
      return nil, err
    }
  } else {
    hashedPassword = acc.Password
  }
  account := Account{
    Username:         strings.ToLower(acc.Username),
    Password:         hashedPassword,
    RegistrationTime: time.Now(),
    AppUser:          acc.AppUser}
  fmt.Println("PutAccount, account:", account) // before saving it prints the AppUser without problems
  key := datastore.NameKey("Account", account.Username, nil)
  return database.DatastoreClient().Put(ctx, key, &account)
}

Get func:

func GetAccount(ctx context.Context, key *datastore.Key) (Account, error) {
  var account Account
  err := database.DatastoreClient().Get(ctx, key, &account)
  if err != nil {
    return account, err
  }
  return account, nil
}

1 个答案:

答案 0 :(得分:1)

使用命名结构工作。例如:

type Account struct {
  Username         string    // NameKey
  Password         []byte    `datastore:",noindex"`
  RegistrationTime time.Time `datastore:",noindex"`
  AppUser          AppUser
}

至于为什么匿名嵌入式结构没有,这可能值得issue