Call a Struct and its Method by name in Go?

后端 未结 4 691
我在风中等你
我在风中等你 2020-12-02 05:47

I have found a function call MethodByName() here http://golang.org/pkg/reflect/#Value.MethodByName but it\'s not exactly what I want! (maybe because I don\'t kn

4条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-02 06:00

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    type Log struct {
        Path  string
        Level string
    }
    
    func (l *Log) Conversion(i interface{}) {
    
        if data, ok := i.(*Log); ok {
            if data != nil {
                if len(data.Path) > 0 {
                    l.Path = data.Path
                }
                if len(data.Level) > 0 {
                    l.Level = data.Level
                }
            }
        }
    }
    
    type Storage struct {
        Type       string
        ServerList []string
    }
    
    func (s *Storage) Conversion(i interface{}) {
    
       if data, ok := i.(*Storage); ok {
            if data != nil {
                if len(data.Type) > 0 {
                    s.Type = data.Type
                }
            }
        }
    }
    
    type Server struct {
        LogConfig     *Log
        StorageConfig *Storage
    }
    
    func main() {
        def := Server{
            LogConfig: &Log{
                Path:  "/your/old/log/path/",
                Level: "info",
            },
            StorageConfig: &Storage{
                Type:       "zookeeper",
                ServerList: []string{"127.0.0.1:2181"},
            },
        }
    
        fmt.Println(def)
        cur := Server{
            LogConfig: &Log{
                Path:  "/your/new/log/path/",
                Level: "debug",
            },
            StorageConfig: &Storage{
                Type:       "etcd",
                ServerList: []string{"127.0.0.1:2379"},
            },
        }
    
        fmt.Println(cur)
    
        defV := reflect.ValueOf(def)
        curV := reflect.ValueOf(cur)
        for k := 0; k < defV.NumField(); k++ {
            in := make([]reflect.Value, 1)
            in[0] = reflect.ValueOf(curV.Field(k).Interface())
            defV.Field(k).MethodByName("Conversion").Call(in)
        }
    
        fmt.Println(def.LogConfig)
        fmt.Println(def.StorageConfig)
    }
    

提交回复
热议问题