利用golang的结构体(struct)、接口(type xxx interface)、字典(map)、反射(reflect),实现动态方法调用。
没有什么好讲的,直接上代码,有不懂的可以给我留言,或者在首页点击QQ图标用QQ联系我。
package main
import (
"encoding/json"
"fmt"
"reflect"
)
var (
// TaskType 没有枚举暂时只能用字典代替
TaskType = map[int]string{
1: "Trancode",
}
)
// Task 任务
type Task struct {
TaskType int
}
func (t *Task) onStart(test string) error {
fmt.Println("onStart", test)
return nil
}
func (t *Task) onDoing(test string) error {
fmt.Println("onDoing", test)
return nil
}
func (t *Task) onFinish(test string) error {
fmt.Println("onFinish", test)
return nil
}
func (t *Task) trancodeStart(test string) error {
fmt.Println("trancodeStart", test)
return t.onStart(test)
}
func (t *Task) trancodeDoing(test string) error {
fmt.Println("trancodeDoing", test)
return t.onDoing(test)
}
func (t *Task) trancodeFinish(test string) error {
fmt.Println("trancodeFinish", test)
return t.onFinish(test)
}
// Trancode 转码
func (t *Task) Trancode(test string) error {
if err := t.trancodeStart(test); err != nil {
return err
}
if err := t.trancodeDoing(test); err != nil {
return err
}
if err := t.trancodeFinish(test); err != nil {
return err
}
return nil
// return fmt.Errorf("测试错误返回")
}
func Do(jsonStr string) {
tType := new(Task)
json.Unmarshal([]byte(jsonStr), tType)
tV := reflect.ValueOf(&tType).Elem()
// 建议这个参数直接放在Task结构体中,这样可以避免所有地方都需要传参
params := make([]reflect.Value, 1)
params[0] = reflect.ValueOf("测试参数")
values := tV.MethodByName(TaskType[tType.TaskType]).Call(params)
if !values[0].IsNil() {
fmt.Println(values[0].Interface())
}
}
func main() {
jsonStr := `{"TaskType":1}`
Do(jsonStr)
}
由于不能自动创建func,暂时还没有想到好的方法。如果你有好的想法欢迎留言或直接联系博主。
如果这篇文章对你有所帮助,可以通过下边的“打赏”功能进行小额的打赏。
本网站部分内容来源于互联网,如有侵犯版权请来信告知,我们将立即处理。