function - Go 是否支持函数的类型转换/类型转换?

标签 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

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

最佳答案

您不能将 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 slice 转换为 []Request,但如果不能,您可以创建一个临时 slice 并一一进行接口(interface)转换:

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
}

应该这样做。

关于function - Go 是否支持函数的类型转换/类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23009221/

相关文章:

c++ - 输出函数 C++ 的问题

go - 如何在不使用复制命令的情况下在大厅测试 golang 代码?

postgresql - 如何阻止 Go gorm 对我在 Postgres 中的自引用外键强制非空约束

C++,从 utility:string_t 到 std::string 的转换在返回时崩溃

python - 使用函数将每个第二个单词替换为单词 'hello'

c++ - 一次发布多个数据

python - 在函数调用中添加要设置的项目?

go - 插入golang代码怎么写?

c++ - 从字符串中读取多个逗号分隔的 double

c# - 为什么我可以放弃 IList<T> 的不变性?