• go通过名称来调用对应的方法


    仅仅是为了学习go语言中的反射。

    package main
    
    import (
    	"errors"
    	"fmt"
    	"reflect"
    )
    
    func Call(m map[string]interface{}, name string, params ...interface{}) ([]reflect.Value,error) {
    	_, found := m[name]
    	if !found {
    		return nil, errors.New("map do not contains key ...")
    	}
    	fv := reflect.ValueOf(m[name])
    	if fv.Kind() != reflect.Func {
    		return nil, errors.New("the value of key is not a function")
    	}
    
    	if len(params) != fv.Type().NumIn() {
    		return nil, errors.New("argument passed in does not match the function")
    	}
    
    	in := make([]reflect.Value, len(params))
    	// for i := 0; i < len(params); i++ {
    	// 	in[i] = reflect.ValueOf(params[i])
    	// }
    	for i, param := range params {
    		in[i] = reflect.ValueOf(param)
    	}
    	return fv.Call(in), nil
    }
    
    func test1(name string) {
    	fmt.Printf("hello,%s 
    ", name)
    }
    
    func test2(name string, age int) {
    	fmt.Printf("hello,my name is %s ,%d years old", name, age)
    }
    
    func main() {
    	m := make(map[string]interface{})
    	m["test1"] = test1
    	m["test2"] = test2
    
    	result, err := Call(m, "test2", "hupeng", 12)
    	if err != nil {
    		panic(err)
    	}
    	fmt.Println(result)
    
    }
    
    
  • 相关阅读:
    关于二分操作的基本应用
    东北育才 d1t4 漂流
    东北育才 d1t1 优雅的序列
    从零开始的图的存储方法
    从零理解的KMP算法
    openjudge T017 黑社会团伙 (并查集)
    东北育才 day6
    poj3071 Football
    noip2015 跳石头
    noip2015 信息传递
  • 原文地址:https://www.cnblogs.com/hupengcool/p/4128522.html
Copyright © 2020-2023  润新知