用于存储的
google.golang.org/api/iterator
似乎按预期工作 — 我能够循环超过 6K 的存储桶对象。然而,当在项目上使用google.golang.org/api/iterator
时,我在iterator.Done
之前只得到了3个项目。我预计>10K。
我已阅读这些供参考:
https://cloud.google.com/go/docs/reference/cloud.google.com/go/resourcemanager/latest/apiv3#cloud_google_com_go_resourcemanager_apiv3_ProjectsClient_ListProjects
https://github.com/googleapis/google-cloud-go/wiki/Iterator-Guidelines
https://pkg.go.dev/google.golang.org/api/iterator
https://pkg.go.dev/cloud.google.com/go/resourcemanager/apiv3
https://pkg.go.dev/cloud.google.com/go/resourcemanager/apiv3/resourcemanagerpb
https://github.com/googleapis/google-cloud-go/blob/main/resourcemanager/apiv3/projects_client_example_test.go
我的问题:
ListProjects()
吗?我看到 PageToken
类型中有 ListProjectsRequest
字段。 (我也试过这个)测试代码:
package main
import (
"context"
"fmt"
"log"
resourcemanager "cloud.google.com/go/resourcemanager/apiv3"
resourcemanagerpb "cloud.google.com/go/resourcemanager/apiv3/resourcemanagerpb"
"google.golang.org/api/iterator"
)
func printFields(p *resourcemanagerpb.Project) {
fmt.Printf("Name\t%s\n", p.Name)
fmt.Printf("ProjectId\t%s\n", p.ProjectId)
fmt.Printf("DisplayName\t%s\n\n", p.DisplayName)
}
func main() {
ctx := context.Background()
c, err := resourcemanager.NewProjectsClient(ctx)
if err != nil {
log.Fatalf("NewProjectsClient() error: %v", err)
}
defer c.Close()
req := &resourcemanagerpb.ListProjectsRequest{
Parent: "organizations/12345678912", // CHANGE-ME
}
it := c.ListProjects(ctx, req)
for {
project, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Fatalf("Next() error: %v", err)
}
printFields(project)
}
}
问题在于
ListProjectsRequest
:
type ListProjectsRequest struct {
// Required. The name of the parent resource whose projects are being listed.
// Only children of this parent resource are listed; descendants are not
// listed.
//
...感谢 Manjuram Perumalla 指出了这一点。