本文介绍如何列举当前账号所有地域下符合指定条件的存储空间。
注意事项
- 本文示例代码以华东1(杭州)的地域ID - cn-hangzhou为例,默认使用外网Endpoint,如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见OSS地域和访问域名。
- 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证。 
- 要列举存储空间,您必须具有 - oss:ListBuckets权限。具体操作,请参见为RAM用户授予自定义的权限策略。
- 使用SDK列举存储空间时,可以通过指定资源组ID来筛选特定资源组下的Bucket。 - 使用SDK列举存储空间时默认不携带资源组ID参数,返回结果的XML里也不会携带资源组相关信息。 
- 如果在请求中携带资源组ID参数,则OSS会返回属于该资源组的所有Bucket。 
- 如果在请求中未携带资源组ID参数,则OSS会返回请求者拥有的所有Bucket。 
 
方法定义
高级版列举存储空间API
- 对常用的列举接口,Go SDK V2最新提供了分页器(Paginator)支持自动分页,当进行多次调用时,自动为您获取下一页结果。使用分页器时,您只需要编写处理结果的代码。 
- 分页器包含了分页器对象<OperationName>Paginator和分页器创建方法New<OperationName>Paginator。分页器创建方法返回一个分页器对象,该对象实现了HasNext和NextPage方法,分别用于判断是否还有更多页,并调用操作来获取下一页。 
列举存储空间的接口定义如下:
type ListBucketsPaginator struct
func (c *Client) NewListBucketsPaginator(request *ListBucketsRequest, optFns ...func(*PaginatorOptions)) *ListBucketsPaginator
func (p *ListBucketsPaginator) HasNext() bool
func (p *ListBucketsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*<OperationName>Result, error)请求参数列表
| 参数名 | 类型 | 说明 | 
| request | *ListBucketsRequest | 设置接口的请求参数,具体请参见ListBucketsRequest | 
| optFns | ...func(*PaginatorOptions) | (可选)接口级的配置参数, 请参见PaginatorOptions | 
返回值列表
| 返回值 | 说明 | 
| *ListBucketsPaginator | 分页器对象,该对象实现了HasNext和NextPage方法,分别用于判断是否还有更多页, 并调用操作来获取下一页 | 
基础版列举存储空间API
func (c *Client) ListBuckets(ctx context.Context, request *ListBucketsRequest, optFns ...func(*Options)) (*ListBucketsResult, error)请求参数列表
| 参数名 | 类型 | 说明 | 
| ctx | context.Context | 请求的上下文,可以用来设置请求的总时限 | 
| request | *ListBucketsRequest | 设置具体接口的请求参数,具体请参见ListBucketsRequest | 
| optFns | ...func(*Options) | (可选)接口级的配置参数, 具体请参见Options | 
返回值列表
| 返回值名 | 类型 | 说明 | 
| result | *ListBucketsResult | 接口返回值,当 err 为nil 时有效,具体请参见ListBucketsResult | 
| err | error | 请求的状态,当请求失败时,err 不为 nil | 
示例代码
使用高级版API列举存储空间
您可以使用以下代码列举当前账号所有地域下的存储空间。
package main
import (
	"context"
	"flag"
	"log"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
	region string // 存储区域
)
// init函数用于初始化命令行参数
func init() {
	flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
	// 解析命令行参数
	flag.Parse()
	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)
	// 创建OSS客户端
	client := oss.NewClient(cfg)
	// 创建列出存储空间的请求
	request := &oss.ListBucketsRequest{}
	// 创建分页器
	p := client.NewListBucketsPaginator(request)
	var i int
	log.Println("Buckets:")
	// 遍历分页器中的每一页
	for p.HasNext() {
		i++
		// 获取下一页的数据
		page, err := p.NextPage(context.TODO())
		if err != nil {
			log.Fatalf("failed to get page %v, %v", i, err)
		}
		// 打印该页中的每个存储空间的信息
		for _, b := range page.Buckets {
			log.Printf("Bucket: %v, StorageClass: %v, Location: %v\n", oss.ToString(b.Name), oss.ToString(b.StorageClass), oss.ToString(b.Location))
		}
	}
}使用基础版API列举存储空间
您可以使用以下代码列举当前账号所有地域下的存储空间。
package main
import (
	"context"
	"flag"
	"log"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
	region string // 存储区域
)
// init 函数用于初始化命令行参数
func init() {
	flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
	// 解析命令行参数
	flag.Parse()
	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)
	// 创建 OSS 客户端
	client := oss.NewClient(cfg)
	// 创建 ListBucketsRequest 请求
	request := &oss.ListBucketsRequest{}
	// 列举当前账号所有地域下的存储空间
	for {
		lsRes, err := client.ListBuckets(context.TODO(), request)
		if err != nil {
			log.Fatalf("Failed to list buckets: %v", err)
		}
		for _, bucket := range lsRes.Buckets {
			log.Printf("Bucket: %s", *bucket.Name)
		}
		if !lsRes.IsTruncated {
			break
		}
		request.Marker = lsRes.NextMarker
	}
	log.Println("List buckets successfully!")
}
常见使用场景
列举指定前缀的存储空间
使用分页器Paginator
您可以使用以下代码列举当前账号所有地域下,以example为前缀(prefix)的存储空间。
package main
import (
	"context"
	"flag"
	"log"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
	region string // 存储区域
)
// init函数用于初始化命令行参数
func init() {
	flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
	// 解析命令行参数
	flag.Parse()
	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)
	// 创建OSS客户端
	client := oss.NewClient(cfg)
	// 创建列出存储空间的请求
	request := &oss.ListBucketsRequest{
		Prefix: oss.Ptr("example"), // 设置前缀为"example",只列出名称以该prefix开头的存储空间
	}
	// 创建分页器
	p := client.NewListBucketsPaginator(request)
	var i int
	log.Println("Buckets:")
	// 遍历分页器中的每一页
	for p.HasNext() {
		i++
		// 获取下一页的数据
		page, err := p.NextPage(context.TODO())
		if err != nil {
			log.Fatalf("failed to get page %v, %v", i, err)
		}
		// 打印该页中的每个存储空间的信息
		for _, b := range page.Buckets {
			log.Printf("Bucket: %v, StorageClass: %v, Location: %v\n", oss.ToString(b.Name), oss.ToString(b.StorageClass), oss.ToString(b.Location))
		}
	}
}
使用ListBuckets
您可以使用以下代码列举当前账号所有地域下,以example为前缀(prefix)的存储空间。
package main
import (
	"context"
	"flag"
	"log"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
	region string // 存储区域
)
// init 函数用于初始化命令行参数
func init() {
	flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
	// 解析命令行参数
	flag.Parse()
	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)
	// 创建 OSS 客户端
	client := oss.NewClient(cfg)
	// 创建 ListBucketsRequest 请求
	request := &oss.ListBucketsRequest{
		Prefix:  oss.Ptr("example"),
	}
	// 列举当前账号所有地域下的存储空间
	for {
		lsRes, err := client.ListBuckets(context.TODO(), request)
		if err != nil {
			log.Fatalf("Failed to list buckets: %v", err)
		}
		for _, bucket := range lsRes.Buckets {
			log.Printf("Bucket: %s", *bucket.Name)
		}
		if !lsRes.IsTruncated {
			break
		}
		request.Marker = lsRes.NextMarker
	}
	log.Println("List buckets successfully!")
}
列举指定marker之后的存储空间
使用分页器Paginator
您可以使用以下代码列举当前账号所有地域下,名称的字母序排在example-bucket之后的存储空间。
package main
import (
	"context"
	"flag"
	"log"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
	region string // 存储区域
)
// init函数用于初始化命令行参数
func init() {
	flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
	// 解析命令行参数
	flag.Parse()
	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)
	// 创建OSS客户端
	client := oss.NewClient(cfg)
	// 创建列出存储空间的请求
	request := &oss.ListBucketsRequest{
		Marker: oss.Ptr("example-bucket"), // 设置marker为"example-bucket",从该marker开始列出存储空间
	}
	// 创建分页器
	p := client.NewListBucketsPaginator(request)
	var i int
	log.Println("Buckets:")
	// 遍历分页器中的每一页
	for p.HasNext() {
		i++
		// 获取下一页的数据
		page, err := p.NextPage(context.TODO())
		if err != nil {
			log.Fatalf("failed to get page %v, %v", i, err)
		}
		// 打印该页中的每个存储空间的信息
		for _, b := range page.Buckets {
			log.Printf("Bucket: %v, StorageClass: %v, Location: %v\n", oss.ToString(b.Name), oss.ToString(b.StorageClass), oss.ToString(b.Location))
		}
	}
}
使用ListBuckets
您可以使用以下代码列举当前账号所有地域下,名称的字母序排在example-bucket之后的存储空间。
package main
import (
	"context"
	"flag"
	"log"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
	region string // 存储区域
)
// init 函数用于初始化命令行参数
func init() {
	flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
	// 解析命令行参数
	flag.Parse()
	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)
	// 创建 OSS 客户端
	client := oss.NewClient(cfg)
	var marker string = "example-bucket"
	// 创建 ListBucketsRequest 请求
	request := &oss.ListBucketsRequest{
		Marker: &marker,
	}
	// 列举当前账号所有地域下的存储空间
	for {
		lsRes, err := client.ListBuckets(context.TODO(), request)
		if err != nil {
			log.Fatalf("Failed to list buckets: %v", err)
		}
		for _, bucket := range lsRes.Buckets {
			log.Printf("Bucket: %s", *bucket.Name)
		}
		if !lsRes.IsTruncated {
			break
		}
		request.Marker = lsRes.NextMarker
	}
	log.Println("List buckets successfully!")
}
列举指定个数的存储空间
使用分页器Paginator
您可以使用以下代码列举当前账号所有地域下的存储空间,并指定每次分页返回的最大数量。
package main
import (
	"context"
	"flag"
	"log"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
	region string // 存储区域
)
// init函数用于初始化命令行参数
func init() {
	flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
	// 解析命令行参数
	flag.Parse()
	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)
	// 创建OSS客户端
	client := oss.NewClient(cfg)
	// 创建列出存储空间的请求
	request := &oss.ListBucketsRequest{
		MaxKeys: 5, // 设置每次分页返回的存储空间数量为5
	}
	// 创建分页器
	p := client.NewListBucketsPaginator(request)
	var i int
	log.Println("Buckets:")
	// 遍历分页器中的每一页
	for p.HasNext() {
		i++
		// 获取下一页的数据
		page, err := p.NextPage(context.TODO())
		if err != nil {
			log.Fatalf("failed to get page %v, %v", i, err)
		}
		// 打印该页中的每个存储空间的信息
		for _, b := range page.Buckets {
			log.Printf("Bucket: %v, StorageClass: %v, Location: %v\n", oss.ToString(b.Name), oss.ToString(b.StorageClass), oss.ToString(b.Location))
		}
	}
}
使用ListBuckets
您可以使用以下代码列举当前账号所有地域下的存储空间,并指定每次分页返回的最大数量。
package main
import (
	"context"
	"flag"
	"log"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
	region string // 存储区域
)
// init 函数用于初始化命令行参数
func init() {
	flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
	// 解析命令行参数
	flag.Parse()
	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)
	// 创建 OSS 客户端
	client := oss.NewClient(cfg)
	// 创建 ListBucketsRequest 请求
	request := &oss.ListBucketsRequest{
		MaxKeys: 10, // 每次列举返回的最大数量
	}
	// 列举当前账号所有地域下的存储空间
	for {
		lsRes, err := client.ListBuckets(context.TODO(), request)
		if err != nil {
			log.Fatalf("Failed to list buckets: %v", err)
		}
		for _, bucket := range lsRes.Buckets {
			log.Printf("Bucket: %s", *bucket.Name)
		}
		if !lsRes.IsTruncated {
			break
		}
		request.Marker = lsRes.NextMarker
	}
	log.Println("List buckets successfully!")
}
列举指定资源组ID下的所有存储空间
使用分页器Paginator
- 在请求参数中指定资源组ID - ResourceGroupId,则OSS会返回属于该资源组的所有Bucket。
- 如果在请求参数中未指定资源组ID - ResourceGroupId,则OSS会返回请求者拥有的所有Bucket。
package main
import (
	"context"
	"flag"
	"log"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
	region string // 存储区域
)
// init函数用于初始化命令行参数
func init() {
	flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
	// 解析命令行参数
	flag.Parse()
	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)
	// 创建OSS客户端
	client := oss.NewClient(cfg)
	// 创建列出存储空间的请求
	request := &oss.ListBucketsRequest{
		ResourceGroupId: oss.Ptr("rg-aek27tc********"), // 列出指定资源组ID下的存储空间
	}
	// 创建分页器
	p := client.NewListBucketsPaginator(request)
	var i int
	log.Println("Buckets:")
	// 遍历分页器中的每一页
	for p.HasNext() {
		i++
		// 获取下一页的数据
		page, err := p.NextPage(context.TODO())
		if err != nil {
			log.Fatalf("failed to get page %v, %v", i, err)
		}
		// 打印该页中的每个存储空间的信息
		for _, b := range page.Buckets {
			log.Printf("Bucket: %v, StorageClass: %v, Location: %v, ResourceGroupId: %v\n", oss.ToString(b.Name), oss.ToString(b.StorageClass), oss.ToString(b.Location), oss.ToString(b.ResourceGroupId))
		}
	}
}
使用ListBuckets
- 在请求参数中指定资源组ID - ResourceGroupId,则OSS会返回属于该资源组的所有Bucket。
- 如果在请求参数中未指定资源组ID - ResourceGroupId,则OSS会返回请求者拥有的所有Bucket。
package main
import (
	"context"
	"flag"
	"log"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
	region string // 存储区域
)
// init 函数用于初始化命令行参数
func init() {
	flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
}
func main() {
	// 解析命令行参数
	flag.Parse()
	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}
	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)
	// 创建 OSS 客户端
	client := oss.NewClient(cfg)
	// 创建 ListBucketsRequest 请求
	request := &oss.ListBucketsRequest{
		MaxKeys:         10,
		ResourceGroupId: oss.Ptr("rg-aek27tc********"), // 列出指定资源组ID下的存储空间
	}
	// 列举当前账号所有地域下的存储空间
	for {
		lsRes, err := client.ListBuckets(context.TODO(), request)
		if err != nil {
			log.Fatalf("Failed to list buckets: %v", err)
		}
		for _, bucket := range lsRes.Buckets {
			log.Printf("Bucket: %s, StorageClass: %v, Location: %v, ResourceGroupId: %v\n", oss.ToString(bucket.Name), oss.ToString(bucket.StorageClass), oss.ToString(bucket.Location), oss.ToString(bucket.ResourceGroupId))
		}
		if !lsRes.IsTruncated {
			break
		}
		request.Marker = lsRes.NextMarker
	}
	log.Println("List buckets successfully!")
}
相关文档
- 关于列举存储空间的完整示例代码,请参见GitHub示例。 
- 关于高级版列举存储空间的API接口,请参见NewListBucketsPaginator。 
- 关于基础版列举存储空间的API接口,请参见ListBuckets。 
- 关于分页器的更多信息,请参见开发者指南。