Go 如何异步发送电子邮件?

Go 如何异步发送电子邮件?,go,asynchronous,Go,Asynchronous,我有一个为请求服务的端点。在请求流中,端点需要生成并发送电子邮件通知(让我们将代码命名为sendmail())。我希望端点异步调用sendmail()。端点不应等待sendmail() 代码如下: func (s *server) MyEndpoint(ctx context.Context, request *MyRequest) (MyResponse, error) { // other logic // async sendEmail() // end async

我有一个为请求服务的端点。在请求流中,端点需要生成并发送电子邮件通知(让我们将代码命名为
sendmail()
)。我希望端点异步调用
sendmail()
。端点不应等待
sendmail()

代码如下:

func (s *server) MyEndpoint(ctx context.Context, request *MyRequest) (MyResponse, error) {
  // other logic

  // async
  sendEmail()
  // end async

  // other logic - should not wait for the response from sendEmail
  
  return getMyResponse(), nil
}
我该怎么做?我意识到这可能是基本的,但我是新手,希望确保遵循最佳实践。

使用您执行并发代码。在您的示例中,您希望在返回时获取响应。一种方法是使用通道

通过向两个函数传递一个通道来实现,其中一个函数生成数据,另一个函数使用数据。有一篇关于频道的好文章。它看起来是这样的(注意,我在这里使用了接口{}类型,如果你有一个具体的类型,这是更好的方式)


您可以在另一个goroutine中执行
go sendmail()
以运行
sendmail
。@BurakSerdar谢谢。就这么简单?如果你意识到这是基本的。。。你看了网上提供的文档了吗?如果是,你发现了什么?你试图解决这个问题了吗?如果是,您遇到了什么问题?如果没有,请看一看。@onepiece,通常情况下,您会希望处理错误,等待完成,等等。这样它就可以更加复杂。但是,进行异步调用就这么简单。您可以尝试使用一个通道,在该通道中推送所有电子邮件内容(您可以创建一个结构,在其中存储所有邮件需求,如电子邮件、正文和内容),并使用一个正在运行的goroutine来处理此问题,该goroutine会侦听该通道,在我的帖子中,
getMyResponse()
实际上并不依赖于来自
sendmail()的响应。这是否意味着我可以不使用频道直接发送电子邮件。重要的是要注意,如果主程序退出,而sendEmail尚未完成,它将被终止。“主程序”指的是运行
s*服务器的主功能吗?如果是这样的话,这就不应该发生。@one-piece是的,这是您的主函数内部的内容。
func (s *server) MyEndpoint(ctx context.Context, request *MyRequest) (MyResponse, error) {
  // other logic

  // async
  c := make(chan interface{})
  go sendEmail(c)
  // end async

  // other logic - should not wait for the response from sendEmail
  // getMyResponse must happen only after sendEmail has done
  return getMyResponse(c), nil
}