适配器代码
package main
import (
"fmt"
"reflect"
"testing"
)
type GMethod struct {
Func interface{}
Args []interface{}
}
func test1(a, b int) {
fmt.Println(a, b)
}
func test2(a, b int, str string) {
fmt.Println(a, b, str)
}
func sum(a, b int) int {
return a + b
}
func Run(method GMethod) {
_func := method.Func
args := method.Args
rFunc := reflect.ValueOf(_func)
rArgs := make([]reflect.Value, 0)
for _, arg := range args {
rArgs = append(rArgs, reflect.ValueOf(arg))
}
rFunc.Call(rArgs)
}
func RunWithReturn(method GMethod) []interface{} {
_func := method.Func
args := method.Args
rFunc := reflect.ValueOf(_func)
rArgs := make([]reflect.Value, 0)
for _, arg := range args {
rArgs = append(rArgs, reflect.ValueOf(arg))
}
rRet := rFunc.Call(rArgs)
actRet := make([]interface{}, 0)
for _, ele := range rRet {
actRet = append(actRet, ele.Interface())
}
return actRet
}
func TestMultiFunc(t *testing.T) {
func1 := GMethod{
Func: test1,
Args: []interface{}{1, 2},
}
Run(func1)
func2 := GMethod{
Func: test2,
Args: []interface{}{1, 2, "Hello"},
}
Run(func2)
}
func TestMultiFuncWithReturn(t *testing.T) {
func3 := GMethod{
Func: sum,
Args: []interface{}{10, 20},
}
ret := RunWithReturn(func3)
fmt.Println(ret[0])
}
遍历结构体代码
package main
import (
"fmt"
"reflect"
)
type Cal struct {
Num1 int
Num2 int
}
func (c *Cal) GetSub(name string) {
res := c.Num1 - c.Num2
fmt.Printf("%v完成了减法运算, %v-%v=%v\n", name, c.Num1, c.Num2, res)
}
func ReflectDemo(cal interface{}) {
rValue := reflect.ValueOf(cal)
rValueEle := rValue.Elem()
num := rValueEle.NumField()
for i := 0; i < num; i++ {
fmt.Println(rValueEle.Field(i).Interface())
}
rMethod := rValue.Method(0)
params := make([]reflect.Value, 0)
params = append(params, reflect.ValueOf("Tom"))
rMethod.Call(params)
}
func main() {
c := Cal{
Num1: 20,
Num2: 9,
}
ReflectDemo(&c)
}
反射新建结构体代码
package main
import (
"fmt"
"reflect"
"testing"
)
type User struct {
UserId string
Name string
}
func ReflectStruct(st interface{}) interface{} {
rType := reflect.TypeOf(st)
rValue := reflect.New(rType)
rValueEle := rValue.Elem()
rValueEle.FieldByName("UserId").SetString("123456")
rValueEle.FieldByName("Name").SetString("李四")
return rValueEle.Interface()
}
func TestReflectStruct(t *testing.T) {
var user User
user = ReflectStruct(user).(User)
fmt.Println(user)
}
网友评论