Golang 'defer' 导致发送(接收)API 响应延迟

Golang 'defer' causing delay in sending(receiving) API response

我创建了一个 API,它在处理完请求后发送一个响应并启动一个记录一些消息的后台 goroutine。在 API 请求被处理后,我使用 'defer' 来执行 goroutine。

以下是代码片段:

发送响应伪代码:

{
  ...
  res.Header().Add("Content-Type", "application/json")
  json.NewEncoder(res).Encode(response)
}

响应结构:

type Response struct {
   StatusCode int16  `json:"statusCode"`
   Message    string `json:"message"`
}

API正文:

{ 
 ...
 defer logMsgs()
 sendAPIResponse()
 return
}

logMsgs 伪代码:

func logMsgs(){
   time.Sleep(10*time.Seconds)
   wg := sync.Waitgroup{}
   wg.Add(1)
   go func(){
      for i = 1 to 10
         print(i)
      wg.Done()
   }()
   wg.Wait()
}

预期结果是收到 API 响应,几秒后(这里是 10 秒)'i' 的值从 1 打印到 10。

但在实际结果中,API 10 秒后收到响应。

根据我的理解,延迟函数是在周围(或 current/enclosing)函数终止或 returns.

之后调用的

所以我必须首先收到 API 响应,然后必须记录 'i' 的值。但就我而言,我在几秒钟(10 秒)过去后收到了回复。如果 'i' 的值非常大,这将是一个主要问题。

如果有人解释这种异常行为并提供可能的解决方案,将会很有帮助。 谢谢

I have used 'defer' to execute goroutine after the API request has been handled.

defer 不启动 goroutine。它在调用 goroutine 上执行延迟函数。并且很可能响应被缓存并且写入它的数据不会被刷新,直到你从你的处理程序中 return。

如果要在新的 goroutine 中执行日志记录,请使用 go 关键字,如下所示:

defer func() {
    go logMsgs()
}()
sendAPIResponse()
return

但是请注意,在从处理程序 returning 之后,启动的 goroutines 无法访问请求和响应特定对象,因为它们可能会被新请求重用。因此,保存/传递记录器需要的所有内容,以便在从处理程序 returning 后安全地使用它们。