我可以检查上下文是否已经设置了超时吗?

huangapple go评论99阅读模式
英文:

Can I check if a context already has timeout set?

问题

你可以使用context.ContextDeadline方法来检查是否设置了超时。Deadline方法返回一个时间戳和一个布尔值,表示是否设置了超时。如果超时已设置,则布尔值为true,否则为false。在你的代码中,你可以使用以下方式检查超时是否已设置:

func (c *Client) Send(ctx context.Context, r *http.Request) (int, []byte, error) {
  if _, ok := ctx.Deadline(); !ok {
    // 超时未设置
  } else {
    // 超时已设置
  }
}

这样,你就可以根据超时是否已设置来执行相应的逻辑。

英文:

I have a custom http client, which has a default timeout value. The code is like this:

type Client struct {
  *http.Client
  timeout time.Duration
}

func (c *Client) Send(ctx context.Context, r *http.Request) (int, []byte, error) {
  // If ctx has timeout set, then don't change it.
  // Otherwise, create new context with ctx.WithTimeout(c.timeout)
}

How can I check if ctx has timeout set or not?

答案1

得分: 9

context.Deadline中检查布尔返回值:

> Deadline返回应该取消代表此上下文完成的工作的时间。当没有设置截止日期时,Deadline返回ok==false。连续调用Deadline返回相同的结果。

func (c *Client) Send(ctx context.Context, r *http.Request) (int, []byte, error) {
    if _, deadlineSet := ctx.Deadline(); !deadlineSet {
        ctx, _ = context.WithTimeout(ctx, c.timeout)
    }
}
英文:

Check the bool return value from context.Deadline:

> Deadline returns the time when work done on behalf of this context
> should be canceled. Deadline returns ok==false when no deadline is
> set. Successive calls to Deadline return the same results.

> Deadline() (deadline time.Time, ok bool)

func (c *Client) Send(ctx context.Context, r *http.Request) (int, []byte, error) {
    if _, deadlineSet := ctx.Deadline(); !deadlineSet {
        ctx, _ = context.WithTimeout(ctx, c.timeout)
    }
}

huangapple
  • 本文由 发表于 2017年6月29日 18:16:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/44822381.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定