Reputation: 9152
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!
Upvotes: 1
Views: 118
Reputation: 16625
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.
Upvotes: 4