我是Golang的新手,但我认为我已经掌握了指针和参考的基本要素,但显然不是:
我有一个必须返回[]github.Repository
的方法,这是来自Github客户端的类型。
API调用返回分页结果,因此我必须循环直到没有结果,并将每次调用的结果添加到allRepos
变量,并返回 。这是我到目前为止所做的:
func (s *inmemService) GetWatchedRepos(ctx context.Context, username string) ([]github.Repository, error) {
s.mtx.RLock()
defer s.mtx.RUnlock()
opt := &github.ListOptions{PerPage: 20}
var allRepos []github.Repository
for {
// repos is of type *[]github.Repository
repos, resp, err := s.ghClient.Activity.ListWatched(ctx, "", opt)
if err != nil {
return []github.Repository{}, err
}
// ERROR: Cannot use repos (type []*github.Repository) as type github.Repository
// but dereferencing it doesn't work, either
allRepos = append(allRepos, repos...)
if resp.NextPage == 0 {
break
}
opt.Page = resp.NextPage
}
return allRepos, nil
}
我的问题:如何追加每次调用的结果并返回[]github.Repository
类型的结果?
另外,为什么不在这里解除引用工作?我已尝试将allRepos = append(allRepos, repos...)
替换为allRepos = append(allRepos, *(repos)...)
但我收到此错误消息:
Invalid indirect of (repos) (type []*github.Repository)
答案 0 :(得分:3)
嗯,这里有些事情不合适:
你在评论中说“repos的类型为*[]github.Repository
”,但是编译器的错误消息表明repos的类型为[]*Repository
“。编译器永远不会(除非有错误)。< / p>
请注意*[]github.Repository
和[]*Repository
是完全不同的类型,尤其是第二个是不一个存储库片段而你不能(真的, 没有 方式)在append()
期间取消引用这些指针:你必须编写一个循环并取消引用每个切片项并逐个追加。
有什么奇怪的:github.Repository
和Repository
似乎是两个不同的类型,来自包github,另一个来自当前包。同样,你也必须顺利完成。
请注意,Go中有无引用。不要再考虑这些:这是一个来自其他语言的概念,在Go中没有帮助(如不存在)。
答案 1 :(得分:0)
在您的示例中,解除引用不正确。你应该这样做:
allRepos = append(allRepos, *repos...)
这是一个简单的示例,用于解除引用指向字符串切片的指针。 https://play.golang.org/p/UDzaG5z8Pf