go lambda函数需用lambda.start接管入口,处理函数签名为func(context.context, t)(u, error);避免init中耗时操作;用aws-lambda-go/events结构体构造事件;http api与rest api响应格式不同,须分别处理。

Go 函数在 AWS Lambda 上跑不起来:main 函数不能有参数
Go 的 main 函数必须是无参无返回的,而 Lambda 要求入口函数接收 context.Context 和事件结构体。直接写 func main(event map[string]interface{}) 会编译失败或冷启动报错。
- 正确做法是用官方 SDK 提供的
lambda.Start—— 它接管执行流,把事件反序列化后传给你的处理函数 - 处理函数签名必须是
func(context.Context, T) (U, error),其中T是输入类型(比如events.APIGatewayProxyRequest),U是输出类型 - 别在
main里做耗时初始化;Lambda 可能复用进程,全局变量或init()里的逻辑只跑一次,但要注意并发安全 - 本地调试时用
lambda.StartHandler模拟,别自己写http.ListenAndServe—— 那不是 Serverless
本地测试 Go Lambda 函数:用 aws-lambda-go/events 构造真实事件
硬编码 JSON 字符串再 json.Unmarshal 容易漏字段、类型错位,导致上线后 nil pointer dereference 或空响应。
- 优先导入
github.com/aws/aws-lambda-go/events,用现成结构体,比如events.APIGatewayProxyRequest或events.SQSEvent - 测试时直接 new 一个结构体填字段,比拼 JSON 字符串更稳;尤其注意
Body是字符串(可能需再json.Unmarshal),Headers是map[string]string,大小写敏感 - API Gateway v2(HTTP API)和 v1(REST API)的事件结构完全不同,用错包会导致
request.RequestContext字段访问 panic - 本地运行
go run main.go即可测试,不需要 Docker 或 SAM CLI —— 除非你要测层(layer)或自定义运行时
Go Lambda 冷启动慢:二进制体积和 init 顺序是关键
Go 编译出的二进制常超 10MB,上传慢、解压慢、加载慢;加上 init 里连 DB 或读配置,首请求延迟轻松破 2s。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 编译加
-ldflags="-s -w"去符号表和调试信息,体积通常降 30%~50% - 避免在
init()或包级变量初始化时做网络调用;DB 连接、Redis 客户端等应延迟到 handler 第一次调用时创建(并缓存到包变量) - 用
go mod vendor+CGO_ENABLED=0 go build确保静态链接;否则 runtime 找不到 libc 会直接 fail - AWS 控制台上传限制是 50MB(zip),但实际建议控制在 15MB 内;超过要走 S3,部署链路变长
Go 函数返回 HTTP 响应:别手动拼 StatusCode 字段
很多教程教人 return map[string]interface{}{"statusCode": 200, "body": "..."} ,这在 REST API 下勉强可用,但在 HTTP API 下会 502 —— 因为它不认这个格式。
- 统一用
events.APIGatewayProxyResponse(REST)或events.APIGatewayV2HTTPRequest+events.APIGatewayV2HTTPResponse(HTTP API) -
Body必须是字符串,中文要json.Marshal后再string(),别直接赋 struct;否则响应体是{} - 设置
IsBase64Encoded: false(默认值),除非你真在传图片;设错会导致前端收到乱码 - Header 大小写不敏感,但
Content-Type推荐全大写,部分旧版网关对content-type解析异常
最麻烦的不是写法,是同一个函数被绑到 REST 和 HTTP API 两种网关时,事件结构和响应结构完全不兼容 —— 别试图用 interface{} 统一处理,分两个 handler 更省心。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










