go reflect的工程使用

在实际工程中,虽然使用reflect会影响性能并且降低代码的可读性,但是reflect能做到代码的动态性和灵活性,因此也被工程上广泛使用,接下里列举几个reflect的应用示例

1. 实现通用的数据序列化和反序列化

package main

import (
    "encoding/json"
    "fmt"
    "reflect"
)

type Person struct {
    Name string
    Age  int
}

func serialize(obj interface{}) ([]byte, error) {
    value := reflect.ValueOf(obj)
    if value.Kind()!= reflect.Struct {
        return nil, fmt.Errorf("input is not a struct")
    }

    data := make(map[string]interface{})
    typeOfObj := value.Type()
    for i := 0; i < value.NumField(); i++ {
        fieldValue := value.Field(i)
        fieldType := typeOfObj.Field(i)
        data[fieldType.Name] = fieldValue.Interface()
    }

    return json.Marshal(data)
}

func main() {
    p := Person{Name: "Alice", Age: 25}
    serializedData, err := serialize(p)
    if err!= nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(serializedData))
}

2. 动态调用

package main

import (
    "fmt"
    "reflect"
)

type Calculator struct{}

func (c Calculator) Add(a, b int) int {
    return a + b
}

func invokeMethod(obj interface{}, methodName string, params...interface{}) {
    value := reflect.ValueOf(obj)
    method := value.MethodByName(methodName)
    if!method.IsValid() {
        fmt.Println("Method not found")
        return
    }

    in := make([]reflect.Value, len(params))
    for i, param := range params {
        in[i] = reflect.ValueOf(param)
    }

    result := method.Call(in)
    fmt.Println(result[0].Interface())
}

func main() {
    c := Calculator{}
    invokeMethod(c, "Add", 5, 3)
}

3. 构建动态数据处理管道

package main

import (
    "fmt"
    "reflect"
)

type Processor interface {
    Process(data interface{}) interface{}
}

type DoubleProcessor struct{}

func (d DoubleProcessor) Process(data interface{}) interface{} {
    if num, ok := data.(int); ok {
        return num * 2
    }
    return data
}

func processData(data interface{}, processors []Processor) interface{} {
    value := reflect.ValueOf(data)
    for _, processor := range processors {
        pValue := reflect.ValueOf(processor)
        method := pValue.MethodByName("Process")
        in := []reflect.Value{value}
        result := method.Call(in)
        value = result[0]
    }
    return value.Interface()
}

func main() {
    processors := []Processor{DoubleProcessor{}}
    result := processData(5, processors)
    fmt.Println(result)
}

相关推荐

  1. go reflect工程使用

    2024-07-20 09:10:01       17 阅读
  2. postman工具使用

    2024-07-20 09:10:01       26 阅读
  3. Native API 在 HarmonyOS 应用工程使用指导

    2024-07-20 09:10:01       46 阅读
  4. Namp扫描工具使用

    2024-07-20 09:10:01       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 09:10:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 09:10:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 09:10:01       45 阅读
  4. Python语言-面向对象

    2024-07-20 09:10:01       55 阅读

热门阅读

  1. RKE部署k8s

    2024-07-20 09:10:01       18 阅读
  2. 关于取模的相关注意

    2024-07-20 09:10:01       17 阅读
  3. nodejs使用request后端访问第三方接口

    2024-07-20 09:10:01       17 阅读
  4. docker compose 部署交互模式的容器-以Ubuntu为例

    2024-07-20 09:10:01       17 阅读
  5. Spring源码系列一:入门——Hello World

    2024-07-20 09:10:01       14 阅读
  6. docker build时的网络问题

    2024-07-20 09:10:01       13 阅读