函数返回指向struct slice的指针只返回1

时间:2017-05-01 21:22:33

标签: go google-cloud-datastore

我的功能基本上是这样的:

func (db *datastoreDB) GetAllUsers(ctx context.Context) (*[]User, error) {
  query := datastore.NewQuery("User")
  var users []User
  _, err := db.client.GetAll(ctx, query, &users)
  return &users, nil
}

结构:

type User struct {
  username string
  password []byte
}

现在,如果我试着打电话

users, err := models.DB.GetAllUsers(ctx)
log.Println(users)

然后它只会打印1个用户,即使有很多..

我尝试使用用户[0],用户[1]进行打印但返回错误,也尝试使用* users [1],& users [1]和for i, _ range users { log.Println(users[i]) }

无法理解何时/如何使用*和&即使我阅读了许多在线教程,所以经常只是做跟踪和错误..我怀疑我的数据存储区GetAll函数有什么问题,所以我假设我只是无法正确访问/返回结构切片但感觉我尝试了一切。

1 个答案:

答案 0 :(得分:0)

切片包括指针;实际上它们是带有指向数组的指针的结构,以及关于开始结束的位置的一些信息。

  

切片是数组段的描述符。它由指向数组的指针,段的长度及其容量(段的最大长度)组成

类型之前的星号将该类型指定为指针(除非它已经是指针,在这种情况下它取消引用它)。我想你可能打算写 []*User ,它会指向一些指向用户的指针。您可以将[]User视为不同的类型。

要创建切片,最简单的方法可能是make();

您可以尝试,而不是var users []User

users := make([]*User, 0) // replace 0 with the amount of nil values in the slice you're looking to fill

最后,您必须删除&之前放置的users符号,因为这些符号会将指针传递给某个值(但是当我指出在上面时,切片已经是指针)

为了更好地理解指针,Dave Cheney最近写了一篇名为Understand Go pointers in less than 800 words or your money back的博客文章,你可能会发现它很有用。