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!
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.