golang反射用法举例(注册插件)

有关golang反射的内容,网上有大量讲述,请自行google——"golang反射三法则"

下面主要反射在实际中的一种应用,插件注册与插件管理

package main

import (
    "fmt"

    "reflect"
)

type MyInterface interface {
    Test()
}

type Mytype1 struct {
    A string
    B string
}

func (m Mytype1) Test() {
    fmt.Println("test type1", m)
}

type Mytype2 struct {
    A string
    B string
}

func (m Mytype2) Test() {
    fmt.Println("test type2", m)
}

func main() {
    // testType1 testType2模拟两个注册的插件,实际可在各.go的init()方式实现
    testType1 := reflect.TypeOf((*Mytype1)(nil)).Elem()
    testType2 := reflect.TypeOf((*Mytype2)(nil)).Elem()

    types := []reflect.Type{testType1, testType2}
    fmt.Println("types:", types)

    // 模拟插件管理,统一调用
    var instance interface{}
    for _, testType := range types {
        instance = reflect.New(testType).Interface()
        if myinterface, ok := instance.(MyInterface); ok {
            //模拟统一调用
            myinterface.Test()
        }

    }

}

输出:

types: [main.Mytype1 main.Mytype2]
test type1 { }
test type2 { }

你可能感兴趣的