Golang Code Pieces

通过reflect调用方法

2019-06-22  本文已影响0人  yanjusong
package main

import (
    "errors"
    "fmt"
    "reflect"
)

type T struct{}

func (t *T) Do() {
    fmt.Println("hello")
}

func (t *T) DoArgs(a int, b string) {
    fmt.Println("hello"+b, a)
}

func (t *T) DoWithReturn() (string, error) {
    return "hello", errors.New("new error")
}

func main() {
    t := &T{}

    // 调用无参数方法
    reflect.ValueOf(t).MethodByName("Do").Call(nil)

    // 调用有参数方法
    reflect.ValueOf(t).MethodByName("DoArgs").Call([]reflect.Value{reflect.ValueOf(1111), reflect.ValueOf("world")})

    // 调用有返回的方法
    ret := reflect.ValueOf(t).MethodByName("DoWithReturn").Call(nil)
    fmt.Printf("strValue: %[1]v\nerrValue: %[2]v\nstrType: %[1]T\nerrType: %[2]T\n", ret[0], ret[1].Interface().(error))

    defer func() {
        if err := recover(); err != nil {
            fmt.Printf("cacth panic, err: %+v\n", err)
        }
    }()

    // 调用一个不存在的方法会产生panic
    reflect.ValueOf(t).MethodByName("None").Call(nil)
}

Output:


image.png
上一篇 下一篇

猜你喜欢

热点阅读