展开目录
利用golang的反射实现类似js中的apply方法
golangApply
X
陈尼玛的博客
记录开发生涯的踩坑经历,用时间来验证成长
加载中

在javascript中可以用 func1.apply(this,[...]) 的语句实现多个参数调用给func1方法去执行,而golang中似乎没有直接的方法。

为此我查了一下别人怎么搞得:http://stackoverflow.com/questions/17555857/go-unpacking-array-as-arguments

看了最靠谱的答案是这个:

package main
import "fmt"
import "reflect"

func my_func(a, b int) (int) {
    return a + b
}

func main() {
    arr := []int{2,4}
    var args []reflect.Value
    for _, x := range arr {
        args = append(args, reflect.ValueOf(x))
    }
    fun := reflect.ValueOf(my_func)
    result := fun.Call(args)
    sum := result[0].Interface().(int)
    fmt.Println("Sum is ", sum)
}

然而这个答案没有被采纳。。但这个答案给了我解决问题的关键点,使用反射来实现不定参数的传递。我稍微整理了一下,最后得出以下测试代码:

package main

import (
    "fmt"
    "reflect"
)

func Apply(handle (interface{}), argv ... interface{}) ([]reflect.Value) {
    var args []reflect.Value
    for _, x := range argv {
        args = append(args, reflect.ValueOf(x))
    }
    fun := reflect.ValueOf(handle)
    result := fun.Call(args)
    return result
}

func main() {
  xy := Apply(func (a, b int) (int,int) {
    return a + b , a - b
  },12,34);

  fmt.Println("Sum is ",xy[0],xy[1])
}

参考资料:

http://stackoverflow.com/questions/17555857/go-unpacking-array-as-arguments

http://xhrwang.me/2014/12/29/golang-fundamentals-8-interface.html

https://www.tiege.me/?p=483

相关文档

暂无

随便看看

  1. react项目webpack打包时拆分异步加载的文件

  2. 华为等国产手机rem宽度超过实际宽度

  3. word文件命令行打印

  4. raw.githubusercontent.com DNS被指向127.0.0.1

  5. npm远程服务器某些配置不兼容代理的解决办法

  6. jxa运动指令脚本

  7. 树莓派实现用pi用户自动登录

  8. git删除远程分支

  9. python 用摄像头拍照并写入文件

  10. 判断变量是否 0 或者 '0'

  11. npm设置仓库地址和代理

  12. webrtc服务搭建

  13. putty使用http代理连接服务器

  14. 把树莓派的存储空间拓展到整张TF卡中

  15. sendmail用nginx做代理

  16. 随机取某个概率区间的代码

  17. 数据库清理优化

  18. 感谢beego陪伴我度过那不靠谱的半年

  19. 配置mysql ssl连接

畅言模块加载中