有关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 { }