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

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

Does Go support type casting/conversion for functions?

问题

我正在编写一个名为"GoRequest"的库,它封装了net/http包,旨在创建一个简单的HTTP客户端。

现在,我遇到了一个函数转换的问题,该函数的参数类型相似。以下是我的问题代码片段:

  1. type Request *http.Request
  2. type Response *http.Response
  3. func (s *SuperAgent) RedirectPolicy(policy func(req Request, via []Request) error) *SuperAgent {
  4. s.Client.CheckRedirect = policy
  5. return s
  6. }

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)

但是它给我返回了一个错误:

  1. ./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.

  1. type Request *http.Request
  2. type Response *http.Response
  3. func (s *SuperAgent) RedirectPolicy(policy func(req Request, via []Request) error) *SuperAgent {
  4. s.Client.CheckRedirect = policy
  5. return s
  6. }

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:

  1. ./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包装在一个匿名函数中,让它为你进行转换。像这样:

  1. func (s *SuperAgent) RedirectPolicy(policy func(req Request, via []Request) error) *SuperAgent {
  2. s.Client.CheckRedirect = func(r *http.Request, v []*http.Request) error {
  3. return policy(Request(r), []Request(v))
  4. }
  5. return s
  6. }

我不确定你是否可以将[]*http.Request切片转换为[]Request,但如果不能,你可以创建一个临时切片,并逐个进行接口转换:

  1. func (s *SuperAgent) RedirectPolicy(policy func(req Request, via []Request) error) *SuperAgent {
  2. s.Client.CheckRedirect = func(r *http.Request, v []*http.Request) error {
  3. vv := make([]Request, len(v))
  4. for i, r := range v {
  5. vv[i] = Request(r)
  6. }
  7. return policy(Request(r), vv)
  8. }
  9. return s
  10. }

这样应该可以解决问题。

英文:

Can't you just wrap policy in an anonymous function that would do the conversion for you? Something like this:

  1. func (s *SuperAgent) RedirectPolicy(policy func(req Request, via []Request) error) *SuperAgent {
  2. s.Client.CheckRedirect = func(r *http.Request, v []*http.Request) error {
  3. return policy(Request(r), []Request(v))
  4. }
  5. return s
  6. }

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:

  1. func (s *SuperAgent) RedirectPolicy(policy func(req Request, via []Request) error) *SuperAgent {
  2. s.Client.CheckRedirect = func(r *http.Request, v []*http.Request) error {
  3. vv := make([]Request, len(v))
  4. for i, r := range v {
  5. vv[i] = Request(r)
  6. }
  7. return policy(Request(r), vv)
  8. }
  9. return s
  10. }

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:

确定