网站换皮肤了
golang面向对象设计(OOP)
时间:2018-07-06 10:41 浏览:221

摘要

利用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,暂时还没有想到好的方法。如果你有好的想法欢迎留言或直接联系博主。




如果这篇文章对你有所帮助,可以通过下边的“打赏”功能进行小额的打赏。

本网站部分内容来源于互联网,如有侵犯版权请来信告知,我们将立即处理。


来说两句吧