go语言利用reflect存储函数和参数

作者: 从火星来 | 来源:发表于2018-04-26 10:12 被阅读37次

go语言利用reflect存储函数和参数

本文提供go语言中一种存储任意类型函数和参数的方法。
源代码链接:https://gitee.com/rocket049/golang_test/tree/master/src/funcs

思路

利用reflect.Value类型存储多个任意类型的函数和任意类型的参数,以便在其他位置和时机执行。

导入包

存储类型使用 list.List,因此需要导入 container/listreflect 两个包。
代码如下:

import( 
    "container/list"
    "reflect"
)

定义一个可执行结构

自定义结构体theCallable用于存储任意类型的函数和参数。
代码如下:

type theCallable struct{
    f reflect.Value         //存储函数
    args []reflect.Value    //存储参数
}

定义一个列表

自定义结构体FuncList用于存储任意数量的theCallable
代码如下:

type FuncList struct{
    func_list *list.List
}

初始化函数

函数NewFuncList用于初始化一个FuncList的指针。
代码如下:

func (self *FuncList)Init(){
    self.func_list = new(list.List)
    self.func_list.Init()
}

FuncList添加AddRun方法

FuncList对象的Add方法用于加入函数,Run方法用于顺序执行内部存储的函数。
代码如下:

// Add( func,args... ):成功加入后返回 true ,出错的话返回 false
func (self *FuncList)Add( f interface{} ,args... interface{} ) bool {
    var call1 *theCallable = new( theCallable )
    call1.f = reflect.ValueOf( f )
    t := call1.f.Type()
    if t.Kind()==reflect.Func {
        call1.args = make( []reflect.Value, len(args) )
        for i:=0;i<len(args);i++ {
            call1.args[i] = reflect.ValueOf( args[i] )
        }
        self.func_list.PushBack( call1 )
        return true
    } else {
        return false
    }
}
// Run():顺序执行存储在内部的函数,然后清除列表
func (self *FuncList)Run(){
    var call1 *theCallable
    for e:=self.func_list.Front();e!=nil;e=e.Next(){
        call1,_ = e.Value.(*theCallable)
        call1.f.Call( call1.args )
    }
    self.func_list.Init()
}

用例

testx函数的参数为数量不定的int类型,用于测试。
代码如下:

func testx(args... int){
    fmt.Println("testx 参数量:",len(args))
    for i:=0;i<len(args);i++{
        fmt.Println(args[i])
    }
}

func main(){
    fl := NewFuncList()
    ok := fl.Add(testx)
    fmt.Println("Add(testx)",ok)
    ok = fl.Add(testx,1)
    fmt.Println("Add(testx,1)",ok)
    ok = fl.Add(testx,4,5)
    fmt.Println("Add(testx,4,5)",ok)
    fl.Add(testx,9,4,6)
    fmt.Println("Add(testx,9,4,6)",ok)
    fl.Run()
    fl.Run()  //第二次执行时内部列表已经空了,不会重复执行
}

输出如下:

Add(testx) true
Add(testx,1) true
Add(testx,4,5) true
Add(testx,9,4,6) true
testx 参数量: 0
testx 参数量: 1
1
testx 参数量: 2
4
5
testx 参数量: 3
9
4
6

结束

相关文章

  • go语言利用reflect存储函数和参数

    go语言利用reflect存储函数和参数 本文提供go语言中一种存储任意类型函数和参数的方法。源代码链接:http...

  • (四)go语言函数&参数传递

    go语言函数 基本语法 例子 go语言参数传递

  • 三、Go的函数

    三、Go的函数 Go语言最少有一个main()函数。 1、Go的函数定义: 2、函数参数 函数如果使用参数,该变量...

  • go 语言基础--函数

    1、函数 和C语言类型,Go语言也有函数的概念,语法如下: 2 参数和返回值 2.1 返回值 go 语言可以返回零...

  • defer 的几个例子

    defer 每次执行时,Go 语言会把它携带的 defer 函数及其参数值另行存储到一个栈(FILO)。 示例一:...

  • Go 函数参数传递详解

    前言:go语言函数参数为值拷贝(指针参数为指针拷贝)。 形参和实参百科1.普通函数参数2.特殊函数参数 1.普通函...

  • 什么是amino编码

    1. Reflect反射 1.1 关于go的reflect 现代通用编程语言中,有的语言支持反射,有的不支持。并且...

  • Go 函数

    函数定义 Go 语言函数定义格式如下: 以下实例为 max() 函数的代码,该函数传入两个整型参数 num1 和 ...

  • golang 基础(9)函数

    函数 函数是由函数名,参数,返回值和函数体所组成。 定义函数并且复习一下之前的 switch 语句 在 go 语言...

  • golang 基础(F)函数的参数

    函数 函数是由函数名,参数,返回值和函数体所组成。 定义函数并且复习一下之前的 switch 语句 在 go 语言...

网友评论

    本文标题:go语言利用reflect存储函数和参数

    本文链接:https://www.haomeiwen.com/subject/frlplftx.html