如何迭代Google Admin SDK UsersService.List返回的分页用户列表?
Google Admin API 全量用户分页迭代实现(Go语言)
针对你遇到的分页迭代问题,有两种简洁的解决方式,均基于Google Go客户端库的原生能力:
方法一:手动管理PageToken循环遍历
核心思路是每次请求时传入上一页返回的NextPageToken,直到Token为空(表示所有页已遍历完成)。你可以通过PageToken()方法给List请求指定分页Token,这就是你要找的「指定下一页Token」的入口。
完整代码示例:
package main import ( "context" "fmt" "os" admin "google.golang.org/api/admin/directory/v1" "google.golang.org/api/option" "google.golang.org/api/googleapi" ) func main() { ctx := context.Background() credentialsPath := "path/to/your/credentials.json" adminService, err := admin.NewService(ctx, option.WithCredentialsFile(credentialsPath), ) if err != nil { fmt.Printf("创建Admin服务失败: %v\n", err) os.Exit(1) } var pageToken string for { // 构建List请求,若存在分页Token则传入 listReq := adminService.Users.List().Customer("my_customer") if pageToken != "" { listReq = listReq.PageToken(pageToken) } usersResp, err := listReq.Do() if err != nil { if e, ok := err.(*googleapi.Error); ok { fmt.Printf("错误码: %v\n", e.Code) fmt.Printf("错误信息: %v\n", e.Message) } else { fmt.Printf("请求失败: %v\n", err) } os.Exit(1) } // 处理当前页的用户数据 for _, user := range usersResp.Users { fmt.Printf("用户: %s (%s)\n", user.Name.FullName, user.PrimaryEmail) } // 更新分页Token,为空则终止循环 pageToken = usersResp.NextPageToken if pageToken == "" { break } } }
方法二:使用内置Pages迭代器(推荐)
Google客户端库提供了Pages方法,会自动帮你处理分页逻辑,无需手动管理Token,代码更简洁。
完整代码示例:
package main import ( "context" "fmt" "os" admin "google.golang.org/api/admin/directory/v1" "google.golang.org/api/option" "google.golang.org/api/googleapi" ) func main() { ctx := context.Background() credentialsPath := "path/to/your/credentials.json" adminService, err := admin.NewService(ctx, option.WithCredentialsFile(credentialsPath), ) if err != nil { fmt.Printf("创建Admin服务失败: %v\n", err) os.Exit(1) } // 调用Pages方法自动遍历所有分页 err = adminService.Users.List().Customer("my_customer").Pages(ctx, func(page *admin.Users) error { // 处理当前页用户数据 for _, user := range page.Users { fmt.Printf("用户: %s (%s)\n", user.Name.FullName, user.PrimaryEmail) } return nil }) if err != nil { if e, ok := err.(*googleapi.Error); ok { fmt.Printf("错误码: %v\n", e.Code) fmt.Printf("错误信息: %v\n", e.Message) } else { fmt.Printf("迭代失败: %v\n", err) } os.Exit(1) } }
关键说明
PageToken()方法是你需要的指定下一页Token的入口,在UsersListCall对象上可直接调用。Pages方法会自动处理分页请求,每次获取一页数据后执行回调函数,直到所有页处理完成。
内容的提问来源于stack exchange,提问作者Omortis
相关产品推荐
相关产品推荐

