美文网首页Golang Code Pieces
通过reflect调用方法

通过reflect调用方法

作者: yanjusong | 来源:发表于2019-06-22 23:28 被阅读0次
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

相关文章

网友评论

    本文标题:通过reflect调用方法

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