英文:
Does Go support type casting/conversion for functions?
问题
我正在编写一个名为"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
我找不到任何关于这种类型转换的文档,如果可能的话,请给出建议。
如果不行,请建议其他好的方法。谢谢!
英文:
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
得分: 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
}
这样应该可以解决问题。
英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论