Go支持函数类型转换/转换吗?

时间:2014-04-11 09:51:55

标签: function go type-conversion

我正在编写一个名为"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

我找不到任何此类转换的文档,如果有可能,请建议。 如果没有,请建议其他一些好的方法来做到这一点。谢谢!

1 个答案:

答案 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
}

应该这样做。