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

我是 Go 的新手,无论如何我都不是经验丰富的开发人员,所以请随意抨击。


我正在尝试创建一个将驻留在容器中并从 AWS SQS 读取的 GO 应用程序。目标是应用程序长期存在并不断从队列中读取。


这是我目前作为示例使用的代码。我最大的问题是这是否是对 GOTO 的错误使用,是否有更好的方法。


先感谢您


package main


import (

    "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


}


守着一只汪
浏览 89回答 1
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")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go