Golang:如何附加指针到切片到切片



我是 Golang 新手,但我认为我已经掌握了指针和引用的基本要素,但显然不是:

我有一个必须返回 []github.Repository 的方法,它是 go 中 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)

好吧,这里有些不行:

您在评论中说"存储库属于 *[]github.Repository 类型",但编译器的错误消息表明存储库的类型为 []*Repository"。编译器永远不会(除非有错误(错误。

请注意,*[]github.Repository[]*Repository 是完全不同的类型,尤其是第二个不是存储库的一部分,您不能(真的,没有办法(在append()期间取消引用这些指针:您必须编写一个循环并取消引用每个切片项并逐个附加。

奇怪的是:github.RepositoryRepository似乎是两种不同的类型,一种来自包 github,另一种来自当前包。同样,您也必须直截了当。

请注意,Go 中没有引用。立即停止思考这些:这是一个来自其他语言的概念,在 Go 中没有帮助(因为不存在(。

在您的示例中,取消引用不正确。你应该把它变成这样:

allRepos = append(allRepos, *repos...)

下面是一个取消引用指向字符串切片的指针的简单示例。 https://play.golang.org/p/UDzaG5z8Pf

相关内容

  • 没有找到相关文章

最新更新