Go语言是否支持函数的类型转换/转换?

huangapple go评论94阅读模式
英文:

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.

huangapple
  • 本文由 发表于 2014年4月11日 17:51:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/23009221.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定