为了账号安全,请及时绑定邮箱和手机立即绑定

创建从 SQS 读取而不终止的 GO 应用程序

创建从 SQS 读取而不终止的 GO 应用程序

Go
守着一只汪 2023-02-14 18:04:18
我是 Go 的新手,无论如何我都不是经验丰富的开发人员,所以请随意抨击。我正在尝试创建一个将驻留在容器中并从 AWS SQS 读取的 GO 应用程序。目标是应用程序长期存在并不断从队列中读取。这是我目前作为示例使用的代码。我最大的问题是这是否是对 GOTO 的错误使用,是否有更好的方法。先感谢您package mainimport (    "context"    "fmt"    "log"    "github.com/aws/aws-sdk-go-v2/aws"    "github.com/aws/aws-sdk-go-v2/config"    "github.com/aws/aws-sdk-go-v2/service/sqs")const (    maxMessages = 1)func GetQueueURL(cfg aws.Config, queue string) (*sqs.GetQueueUrlOutput, error) {    sqsClient := sqs.NewFromConfig(cfg)    result, err := sqsClient.GetQueueUrl(context.TODO(), &sqs.GetQueueUrlInput{        QueueName: &queue,    })    if err != nil {        return nil, err    }    return result, nil}func GetMessages(cfg aws.Config, queueUrl string, maxMessages int32) (*sqs.ReceiveMessageOutput, error) {    sqsClient := sqs.NewFromConfig(cfg)    msgResult, err := sqsClient.ReceiveMessage(context.TODO(), &sqs.ReceiveMessageInput{        QueueUrl: &queueUrl,        MaxNumberOfMessages: maxMessages,        WaitTimeSeconds: 10,    })    if err != nil {        return nil, err    }    return msgResult, nil}func main() {    cfg, err := config.LoadDefaultConfig(context.TODO())    if err != nil {        log.Fatal("error")    }    queueName := "queue"    res, err := GetQueueURL(cfg, queueName)    if err != nil {        fmt.Printf("Got an error receiving url: %v", err)    }    FINDMESSAGE:        msgRes, err := GetMessages(cfg, *res.QueueUrl, maxMessages)        if err != nil {            fmt.Printf("Got an error while trying to retrieve messages: %v", err)        }        if len(msgRes.Messages) != 0 {            fmt.Println("Message Body: " + *msgRes.Messages[0].Body)            fmt.Println("Message Handle: " + *msgRes.Messages[0].ReceiptHandle)        }        fmt.Println("No Messages")    goto FINDMESSAGE}
查看完整描述

1 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

我最大的问题是这是否是对 GOTO 的错误使用,是否有更好的方法。


对 的任何使用goto都是对 的错误使用goto,除非您可以表达为什么使用 goto。你的例子是一个 for 循环:


for {

        msgRes, err := GetMessages(cfg, *res.QueueUrl, maxMessages)

        if err != nil {

            fmt.Printf("Got an error while trying to retrieve messages: %v", err)

        }


        if len(msgRes.Messages) != 0 {

            fmt.Println("Message Body: " + *msgRes.Messages[0].Body)

            fmt.Println("Message Handle: " + *msgRes.Messages[0].ReceiptHandle)

        }


        fmt.Println("No Messages")

}


查看完整回答
反对 回复 2023-02-14
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信