【问题标题】:Does Go support type casting/conversion for functions?Go 是否支持函数的类型转换/转换?
【发布时间】:2014-05-25 09:50:35
【问题描述】:

我正在编写一个名为 "GoRequest" 的库,它包含 net/http 包,旨在制作一个简单的 http 客户端。

现在,我遇到了与参数类型相似的函数转换问题。这是我的问题sn-p。

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

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

【问题讨论】:

  • Go 中没有类型别名,每个声明的类型都是新的不同类型,因此两个函数的签名在技术上非常不同。

标签: function go type-conversion


【解决方案1】:

您不能将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
}

应该可以的。

【讨论】:

  • 谢谢!第二个例子很棒。它需要一个循环来对数组进行类型转换。
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 2023-04-07
  • 2014-05-19
  • 1970-01-01
  • 2019-04-06
  • 2020-07-15
  • 2022-01-01
  • 2014-08-30
相关资源
最近更新 更多