查看 Go文档 https://docs.aws.amazon.com/lambda/latest/dg/golang-handler.html中官方AWS Lambda 函数处理程序中的使用全局状态部分
建议在 ie 中初始化所有全局状态,func init()
即我们希望在多个 lambda 调用之间共享的任何包级别 vars 到这里。
我的理解是,每次 lambda 容器启动(即冷启动)都会进行一次初始化。
我的问题是,是否可以使用func main()
代替func init()
. 由于运行的副作用,
使用func init()
基本上使我的处理程序函数 ( ) 不可单元测试。
将代码移动到似乎很容易解决这个问题。使用vs
有副作用吗func LambdaHandler
func init()
func init()
func main()
func main()
func init()
代码示例
使用 func init()
package main
import (
"log"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/aws"
)
var invokeCount = 0
var myObjects []*s3.Object
func init() {
svc := s3.New(session.New())
input := &s3.ListObjectsV2Input{
Bucket: aws.String("examplebucket"),
}
result, _ := svc.ListObjectsV2(input)
myObjects = result.Contents
}
func LambdaHandler() (int, error) {
invokeCount = invokeCount + 1
log.Print(myObjects)
return invokeCount, nil
}
func main() {
lambda.Start(LambdaHandler)
}
对比
使用函数 main()
package main
import (
"log"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/aws"
)
var invokeCount = 0
var myObjects []*s3.Object
func LambdaHandler() (int, error) {
invokeCount = invokeCount + 1
log.Print(myObjects)
return invokeCount, nil
}
func main() {
svc := s3.New(session.New())
input := &s3.ListObjectsV2Input{
Bucket: aws.String("examplebucket"),
}
result, _ := svc.ListObjectsV2(input)
myObjects = result.Contents
lambda.Start(LambdaHandler)
}