Go列举存储空间

本文介绍如何列举当前账号所有地域下符合指定条件的存储空间。

注意事项

  • 本文示例代码以华东1(杭州)的地域IDcn-hangzhou为例,默认使用外网Endpoint,如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见OSS地域和访问域名

  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证

  • 要列举存储空间,您必须具有oss:ListBuckets权限。具体操作,请参见为RAM用户授权自定义的权限策略

方法定义

高级版列举存储空间API

重要
  • 对常用的列举接口,Go SDK V2最新提供了分页器(Paginator)支持自动分页,当进行多次调用时,自动为您获取下一页结果。使用分页器时,您只需要编写处理结果的代码。

  • 分页器包含了分页器对象<OperationName>Paginator和分页器创建方法New<OperationName>Paginator。分页器创建方法返回一个分页器对象,该对象实现了HasNextNextPage方法,分别用于判断是否还有更多页,并调用操作来获取下一页。

列举存储空间的接口定义如下:

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

分页器对象,该对象实现了HasNextNextPage方法,分别用于判断是否还有更多页, 并调用操作来获取下一页

基础版列举存储空间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(&region, "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{}

	// 定义一个函数来处理 PaginatorOptions
	modifyOptions := func(opts *oss.PaginatorOptions) {
		// 在这里可以修改opts的值,比如设置每页返回的存储空间数量上限
		// 示例:opts.Limit = 5,即每页返回5个存储空间
		opts.Limit = 5
	}

	// 创建分页器
	p := client.NewListBucketsPaginator(request, modifyOptions)

	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(&region, "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 = ""

	// 创建 ListBucketsRequest 请求
	request := &oss.ListBucketsRequest{
		Prefix:  oss.Ptr(""),
		MaxKeys: 10,
		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
		}
		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(&region, "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(&region, "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 = ""

	// 创建 ListBucketsRequest 请求
	request := &oss.ListBucketsRequest{
		Prefix:  oss.Ptr("example"),
		MaxKeys: 10,
		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
		}
		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(&region, "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(&region, "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
		}
		marker = *lsRes.NextMarker
	}

	log.Println("List buckets successfully!")
}

列举指定个数的存储空间

使用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(&region, "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 = ""

	// 创建 ListBucketsRequest 请求
	request := &oss.ListBucketsRequest{
		Marker:  &marker,
		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
		}
		marker = *lsRes.NextMarker
	}

	log.Println("List buckets successfully!")
}

相关文档