1

I am writing a library named "GoRequest" which wraps around net/http package and is meant for making an easy http client.

Now, I am having a problem with function conversion which has similar types as its parameters. Here is my problem snippet.

type Request *http.Request
type Response *http.Response

func (s *SuperAgent) RedirectPolicy(policy func(req Request, via []Request) error) *SuperAgent {
   s.Client.CheckRedirect = policy
   return s
}

s.Client.CheckRedirect is a member in http.Client struct and should receive func(req *http.Request, via []*http.Request) error

As you might see, I want to convert func(req Request, via []Request) error --> func(req *http.Request, via []*http.Request) which has similar types of parameters.

But it returns me an error:

./main.go:142: cannot use policy (type func(Request, []Request) error) as type func(*http.Request, []*http.Request) error in assignment

I cannot find any document for this kind of conversion and if it's possible, please suggest. If not, please suggest some other good way to do this. Thanks!

1
  • 3
    there is no type-aliasing in Go, every declared type is a new different type and hence the signature of both functions is technically very different. Commented Apr 11, 2014 at 11:32

1 Answer 1

4

Can't you just wrap policy in an anonymous function that would do the conversion for you? Something like this:

func (s *SuperAgent) RedirectPolicy(policy func(req Request, via []Request) error) *SuperAgent {
   s.Client.CheckRedirect = func(r *http.Request, v []*http.Request) error {
       return policy(Request(r), []Request(v))
   }
   return s
}

I'm not actually sure you can convert the []*http.Request slice to a []Request, but if not, you could create a temporary slice and do the interface conversion one by one:

func (s *SuperAgent) RedirectPolicy(policy func(req Request, via []Request) error) *SuperAgent {
   s.Client.CheckRedirect = func(r *http.Request, v []*http.Request) error {
       vv := make([]Request, len(v))
       for i, r := range v {
           vv[i] = Request(r)
       }
       return policy(Request(r), vv)
   }
   return s
}

That should do it.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks! The second example is great. It needs a loop for type casting on array.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.