亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

func init() 用于在 AWS Lambda 處理程序中初始化全局狀態

func init() 用于在 AWS Lambda 處理程序中初始化全局狀態

Go
慕哥9229398 2022-09-05 10:50:50
查看 Go 文檔中官方 AWS Lambda 函數處理程序中的使用全局狀態部分 https://docs.aws.amazon.com/lambda/latest/dg/golang-handler.html建議初始化所有全局狀態,即我們想要在多個 lambda 調用之間共享的任何包級別 var 都在這里。我的理解是,這種初始化是在每個lambda容器啟動(即冷啟動)中完成一次。func init()我的問題是,是否有可能使用而不是做同樣的事情。使用基本上使我的處理程序函數()由于運行的副作用而無法進行單元測試。將代碼移動到似乎很容易解決這個問題。使用 vs 是否有任何副作用func main()func init()func init()func LambdaHandlerfunc 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 = 0var myObjects []*s3.Objectfunc 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)}與使用 func 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 = 0var 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)}
查看完整描述

1 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

我會提出以下建議(我們在很多Go Lambdas中成功使用)。


main.go


[...]


func (h *handler) handleRequest(ctx context.Context) error {

    input := h.s3Client.ListObjectsV2Input{

        Bucket: aws.String("examplebucket"),

    }


    [...]

}


type handler struct {

    s3Client s3iface.S3API

}


// main is called only once, when the Lambda is initialised (started for the first time). Code in this function should

// primarily be used to create service clients, read environments variables, read configuration from disk etc.

func main() {

    h := handler{

        s3client: s3.New(session.New()),

    }


    lambda.Start(h.handleRequest)

}

main_test.go


type ListObjectsV2Mock struct {

    s3iface.S3API


    output *s3.ListObjectsV2Output

}


func TestHandleRequest(t *testing.T) {

    h := handler{

        s3Client: &ListObjectsV2Mock{

            output: &s3.ListObjectsV2Output{...},

        },

    }


    err := h.HandleRequest(context.TODO())

    if err != nil {

        t.Fatalf("unexpected error: %v", err)

    }

}

顯然,缺少很多代碼(導入,錯誤處理等),但這是它的要點。


查看完整回答
反對 回復 2022-09-05
  • 1 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號