downloadTemp2014 2014-04-11 09:51
浏览 25
已采纳

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

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条回答 默认 最新

  • doulai2025 2014-04-11 10:30
    关注

    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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)