code: func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) {
  	if client == nil {
  		client = http.DefaultClient
  	}
  
  	// Request cancelation changed in Go 1.5, see cancelreq.go and cancelreq_go14.go.
  	cancel := canceler(client, req)
  
  	type responseAndError struct {
  		resp *http.Response
  		err  error
  	}
  	result := make(chan responseAndError, 1)
  
  	go func() {
  		resp, err := client.Do(req)
  		result <- responseAndError{resp, err}
  	}()
  
  	select {
  	case <-ctx.Done():
  		cancel()
  		return nil, ctx.Err()
  	case r := <-result:
  		return r.resp, r.err
  	}
  }
docs: // Do sends an HTTP request with the provided http.Client and returns an HTTP response.
  // If the client is nil, http.DefaultClient is used.
  // If the context is canceled or times out, ctx.Err() will be returned.