我是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)

最佳答案

好吧,这里有些问题:

您在注释中说“repos的类型为*[]github.Repository”,但是编译器的错误消息表明repos的类型为“[]*Repository”。编译器永远不会出错(有错误时除外)。

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

也是奇怪的是:github.RepositoryRepository似乎是两种不同类型,一种来自github软件包,另一种来自当前软件包。同样,您也必须弄清楚这一点。

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

关于pointers - Golang : How to append pointer to slice to slice?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42900701/

10-15 06:24