- 示例工程
- 教程
- 后端
【免费下载链接】aws-doc-sdk-examples
Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.
导读
gov2/premium-ex.md是 aws-doc-sdk-examples 仓库中一份特殊的管理型文件:它不直接承载示例代码,而是以清单形式标记出被认定为"高质量(premium)"的 Go V2 示例源码路径,供自动化工作流消费、用于更新知识库(KB)中的优质代码。本文以该清单为骨架,逐一深入剖析被标记的三个示例——S3 桶与对象基础操作(bucket_basics.go)与 DynamoDB 电影表示例场景(scenario_movie_table.go)——完整还原其中的 API 调用链、错误处理与等待器机制,帮助读者理解"什么才是仓库认可的 premium 示例",并掌握可直接复用的 SDK for Go V2 实战写法。
一、premium-ex.md 的定位:一份供工作流消费的优质示例索引
gov2/premium-ex.md全文以注释 + 分类路径的形式组织,核心内容只有三行:
## basics: /s3/actions/bucket_basics.go ## feature-scenario: /s3/actions/bucket_basics.go ## complex-feature-scenario: /dynamodb/scenarios/scenario_movie_table.go文件开头的两行注释说明了它的用途与维护约束:
//Add paths for premium examples here which will be consumed by workflow to update KB with quality code //Don't forget to add new line at the end of this file从中可以提炼出三个关键事实:
- 它是工作流的输入清单:文件中列出的路径会被 CI/CD 工作流消费,用于把高质量代码同步到知识库。因此路径必须精确、可解析,任何格式错误都会直接影响自动化流程。
- 路径是相对
gov2/目录的:清单中的/s3/actions/bucket_basics.go、/dynamodb/scenarios/scenario_movie_table.go均指仓库根目录下gov2/子目录中的文件(对应绝对路径gov2/s3/actions/bucket_basics.go与gov2/dynamodb/scenarios/scenario_movie_table.go)。 - 维护约定明确:新增条目只需在对应分类下追加一行路径,且必须在文件末尾保留换行符,这是该文件唯一需要遵守的格式纪律。
清单定义了三个质量等级分类,从源码结构看,它们大致对应仓库中三类示例形态:
| 分类 | 含义(从清单与源码对应关系推断) | 标记的示例 |
|---|---|---|
basics | 覆盖某服务最核心、最常用操作的基础示例 | S3 桶与对象基础操作 |
feature-scenario | 展示某一功能特性的典型场景示例 | S3 桶与对象基础操作(同样入选) |
complex-feature-scenario | 多步骤、交互式、跨多个 API 的复杂综合场景 | DynamoDB 电影表入门场景 |
值得注意的是,bucket_basics.go同时入选了basics与feature-scenario两个分类,说明该文件既是基础操作合集,又是值得被知识库单独收录的功能特性示例。
二、basics 与 feature-scenario:S3 桶与对象基础操作深度解析
2.1 示例结构与封装思想
被标记的gov2/s3/actions/bucket_basics.go以BucketBasics结构体为核心封装全部 S3 操作。结构体只持有一个字段:
type BucketBasics struct { S3Client *s3.Client }这种"用一个结构体聚合某服务全部基础操作"的封装方式,使得上层场景代码(如gov2/s3/scenarios/scenario_get_started.go)只需持有BucketBasics实例即可完成整套业务流程,也便于在测试中注入 stub 客户端。
2.2 方法清单:一个文件覆盖 S3 全链路
该文件共 414 行,实现了 12 个方法,从"桶是否存在"到"批量删除对象"覆盖了 S3 常用操作的完整链路:
| 方法 | 对应 S3 API | 行号 |
|---|---|---|
ListBuckets | ListBuckets | bucket_basics.go#L39 |
BucketExists | HeadBucket | bucket_basics.go#L67 |
CreateBucket | CreateBucket | bucket_basics.go#L97 |
UploadFile | PutObject | bucket_basics.go#L129 |
UploadLargeObject | 上传管理器(分片并发) | bucket_basics.go#L167 |
DownloadFile | GetObject | bucket_basics.go#L203 |
DownloadLargeObject | 下载管理器(分片并发) | bucket_basics.go#L240 |
CopyToFolder | CopyObject(桶内复制到子目录) | bucket_basics.go#L262 |
CopyToBucket | CopyObject(跨桶复制) | bucket_basics.go#L291 |
ListObjects | ListObjectsV2 | bucket_basics.go#L319 |
DeleteObjects | DeleteObjects | bucket_basics.go#L348 |
DeleteBucket | DeleteBucket | bucket_basics.go#L390 |
2.3 关键实现:等待器、分页器与错误分类
这个示例之所以能入选 premium,除了功能覆盖全面外,还因为它示范了 SDK for Go V2 的三种重要编程模式。
等待器(Waiter):几乎所有写操作之后都调用了等待器,将"API 调用成功"与"服务端状态就绪"两个阶段区分开。例如CreateBucket在成功创建后调用:
err = s3.NewBucketExistsWaiter(basics.S3Client).Wait( ctx, &s3.HeadBucketInput{Bucket: aws.String(name)}, time.Minute)等待器会以轮询HeadBucket的方式确认桶已全局就绪,超时窗口为 1 分钟。上传后对应NewObjectExistsWaiter,删除对象后对应NewObjectNotExistsWaiter,删除桶后对应NewBucketNotExistsWaiter。这种"操作 + 等待确认"的组合是生产级代码的标准写法。
分页器(Paginator):ListBuckets与ListObjects均使用分页器循环拉取全量结果:
bucketPaginator := s3.NewListBucketsPaginator(basics.S3Client, &s3.ListBucketsInput{}) for bucketPaginator.HasMorePages() { output, err = bucketPaginator.NextPage(ctx) ... }分页器封装了 SDK 的分页 Token 逻辑,避免开发者手动处理IsTruncated/ContinuationToken等细节。
错误分类处理:文件大量使用errors.As配合 smithy 类型断言做精细的错误分支。典型的有三类:
- 权限错误:
ListBuckets捕获AccessDenied后提示"无权限"; - 已存在/不存在错误:
CreateBucket区分BucketAlreadyOwnedByYou与BucketAlreadyExists;BucketExists用*types.NotFound判断桶不存在;DownloadFile用*types.NoSuchKey处理对象缺失;ListObjects、DeleteObjects、DeleteBucket均对*types.NoSuchBucket做了专门提示; - 业务限制错误:
UploadFile与UploadLargeObject捕获EntityTooLarge,并给出"大于 5GB 请用控制台(上限 160GB)或分片上传 API(上限 5TB)"的明确指引。
2.4 大对象上传下载:上传/下载管理器的并发分片
UploadLargeObject与DownloadLargeObject是 premium 价值的另一体现。二者都通过feature/s3/manager包实现自动分片并发传输:
var partMiBs int64 = 10 uploader := manager.NewUploader(basics.S3Client, func(u *manager.Uploader) { u.PartSize = partMiBs * 1024 * 1024 })这里将每个分片大小显式配置为 10 MiB。下载侧同样以 10 MiB 分片通过manager.NewDownloader写入manager.NewWriteAtBuffer。对于无法用单次PutObject/GetObject处理的超大对象,这套模式是标准答案。
2.5 运行方式
根据 gov2/s3/README.md 的说明,S3 示例通过统一的cmd运行器启动:
# 查看所有可用场景及帮助 go run ./cmd -h # 运行基础入门场景(包含大文件上传下载) go run ./cmd -scenario getstarted # 运行预签名 URL 场景 go run ./cmd -scenario presigning其中"Learn the basics"场景演示的完整流程为:创建桶并上传文件 → 下载对象 → 复制对象到桶内子目录 → 列举桶内对象 → 删除对象与桶,恰好与bucket_basics.go的方法集一一对应。
三、complex-feature-scenario:DynamoDB 电影表交互式场景深度解析
3.1 场景定位
被标记为complex-feature-scenario的 gov2/dynamodb/scenarios/scenario_movie_table.go 是一个完整的交互式入门场景。函数注释明确列出了它要演示的七个步骤:
- 创建可存放电影数据的表;
- 向表中写入、读取、更新单部电影;
- 从样例 JSON 文件批量写入电影数据;
- 按指定年份 Query(查询)电影;
- 按年份范围 Scan(扫描)电影;
- 从表中删除一部电影;
- 删除整张表。
与单文件封装的BucketBasics不同,该场景函数RunMovieScenario通过依赖注入方式接收三个关键对象,体现了可测试性设计:
func RunMovieScenario( ctx context.Context, sdkConfig aws.Config, questioner demotools.IQuestioner, tableName string, movieSampler actions.IMovieSampler) {questioner:来自gov2/demotools包的问题器接口,负责交互式输入;movieSampler:电影样例数据源接口,从外部 URL 拉取样例数据;- 场景内部通过
dynamodb.NewFromConfig(sdkConfig)构造客户端,使得调用方可以替换为 mock 配置以进行单元测试。
3.2 交互式流程与输入校验
场景全程以log输出进度、以questioner收集输入,并用demotools提供的校验器约束输入范围,是理解"交互式场景如何写得健壮"的优秀范本:
customMovie.Year = questioner.AskInt("What year was it released?", demotools.NotEmpty{}, demotools.InIntRange{Lower: 1900, Upper: 2030}) customMovie.Info["rating"] = questioner.AskFloat64( "Enter a rating between 1 and 10:", demotools.NotEmpty{}, demotools.InFloatRange{Lower: 1, Upper: 10})可以看到,年份被限制在 1900–2030,评分被限制在 1–10,且都不允许为空。这些校验直接作用于actions.Movie结构体的写入逻辑(见 gov2/dynamodb/actions/movie.go)。
3.3 场景背后的 API 调用链
RunMovieScenario中调用的动作方法全部定义在gov2/dynamodb/actions/table_basics.go中,调用链与七步骤一一对应:
- 建表与预检:
TableExists(DescribeTable)判断表是否存在,不存在则CreateMovieTable(CreateTable),幂等地处理重复运行; - 单条写读改:
AddMovie(PutItem)、GetMovie(GetItem)、UpdateMovie(UpdateItem); - 批量写入:
AddMovieBatch(ctx, movies, 250)一次从样例数据批量写入 250 部电影(BatchWriteItem); - 查询与扫描:
Query(ctx, releaseYear)按分区键年份精确查询;Scan(ctx, startYear, endYear)则用投影表达式只返回标题、年份与评分,这正是场景日志中提示"plot 为 nil,因为我们使用了投影表达式"的原因; - 清理:
DeleteMovie(DeleteItem)、ListTables(ListTables)、DeleteTable(DeleteTable)。
场景开头与结尾以 88 个-字符分隔输出,每一步之间也如此,交互体验清晰。收尾部分特意提醒用户"不删除表可能会产生费用",并在删除表前二次确认——这是示例代码对成本意识的体现。
3.4 运行方式
DynamoDB 场景同样通过cmd运行器启动,README(gov2/dynamodb/README.md)中的用法与 S3 一致:
go run ./cmd -scenario movie_table运行后会按上述七步流程与用户交互:输入电影标题、年份、评分、剧情,选择查询/扫描的年份范围,并确认删除操作。
四、premium 示例的质量保障:测试与 stub 机制
清单中被标记的文件并非孤立代码,仓库为它们配套了完整的测试体系,这也是"高质量代码"被工作流收录的先决条件:
- S3 侧:单元测试 bucket_basics_test.go 与 scenario_get_started_test.go 依赖 stub 实现 bucket_basics_stubs.go,另有集成测试
scenario_get_started_integ_test.go; - DynamoDB 侧:对应的 scenario_movie_table_test.go 与 table_basics_test.go 基于 table_basics_stubs.go 完成对
TableBasics与场景流程的覆盖,并提供scenario_movie_table_integ_test.go做真实服务验证。
测试说明(gov2/README.md)同时提醒:运行集成测试可能产生 AWS 账户费用。从这一整套"动作 + 场景 + stub + 单元/集成测试"的目录组织可以推断,入选 premium 清单的门槛包括:结构清晰的封装、对 SDK 错误与等待器的正确处理、以及可脱离真实 AWS 服务运行的测试保障。
五、如何向 premium 清单新增示例
如需将新的 Go V2 示例纳入该清单,按文件注释的约定操作即可:
- 打开
gov2/premium-ex.md; - 根据示例性质,在
basics、feature-scenario或complex-feature-scenario分类下追加一行,路径以gov2/目录为基准(如/dynamodb/scenarios/scenario_partiql_single.go); - 确保文件末尾有一个换行符,这是文件注释中特别强调的格式要求。
同时,参考bucket_basics.go与scenario_movie_table.go的写法:用结构体/依赖注入封装客户端、为写操作配套等待器、为列表操作使用分页器、用errors.As细分错误分支、并为场景提供 stub 与测试,才能保证示例达到"可被工作流收录到知识库"的代码质量基线。
结语
gov2/premium-ex.md虽只有数行路径,却是 aws-doc-sdk-examples 仓库"高质量示例"筛选机制的入口。它标记出的两个示例——S3 的bucket_basics.go与 DynamoDB 的scenario_movie_table.go——分别代表了"单文件全覆盖的基础操作"与"多步骤交互式综合场景"两种 premium 形态。理解这份清单的维护规则,并沿着其中路径通读源码的等待器、分页器与错误处理模式,即可掌握 AWS SDK for Go V2 编写生产级示例代码的核心方法论。
- 示例工程
- 教程
- 后端
【免费下载链接】aws-doc-sdk-examples
Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.
相关推荐
CANN/pypto设置卷积Tile形状
pypto.set_conv_tile_shapes 产品支持情况 | 产品 | 是否支持 | |: |: :| | Ascend 950PR/Ascend 9
人工智能编译器模型编译深度学习高性能计算CANNAscend如何将ConvNeXT-tiny-224集成到生产环境:部署与监控最佳实践
如何将ConvNeXT tiny 224集成到生产环境:部署与监控最佳实践 ConvNeXT tiny 224作为轻量级图像分类模型,在保持高精度的同时具备快速
SWIFT GRPO 实战:Countdown 数学任务的完整强化微调流程——从数据集定义到自定义奖励与训练观测
SWIFT GRPO 实战:Countdown 数学任务的完整强化微调流程——从数据集定义到自定义奖励与训练观测 本文基于 SWIFT 仓库的最佳实践文档 do
示例工程教程后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考