我正在编写一个名为"GoRequest"的库,它包含了net / http包,用于创建一个简单的http客户端。
现在,我遇到了与其参数类似的函数转换问题。这是我的问题片段。
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是http.Client struct中的成员,应该会收到func(req *http.Request, via []*http.Request) error
如您所见,我想转换func(req Request, via []Request) error
- > func(req *http.Request, via []*http.Request)
具有相似类型的参数。
但它给我一个错误:
./main.go:142: cannot use policy (type func(Request, []Request) error) as type func(*http.Request, []*http.Request) error in assignment
我找不到任何此类转换的文档,如果有可能,请建议。 如果没有,请建议其他一些好的方法来做到这一点。谢谢!
答案 0 :(得分:4)
你能不能将policy
包装在一个匿名函数中,为你做转换?像这样:
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
}
我实际上不确定您是否可以将[]*http.Request
切片转换为[]Request
,但如果没有,您可以创建一个临时切片并逐个进行接口转换:
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
}
应该这样做。