我正在编写一个名为"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结构的成员,应该接收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
我找不到任何这种转换的文件,如果可能的话,请建议。如果没有,请提出其他一些好的方法来做这件事。谢谢!
发布于 2014-04-11 10:30:47
您不能将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
}
这样就行了。
https://stackoverflow.com/questions/23009221
复制相似问题