### 1. 语法/理论讲解
interface{} + reflect包两大核心组件
import "reflect"
// 1. Type - 类型信息
var x int = 42
t := reflect.TypeOf(x) // 获取类型信息
// 2. Value - 值信息
v := reflect.ValueOf(x) // 获取值信息
关键概念
性能注意事项
### 2. 应用场景
### 3. 编程示例
通用配置管理
type Config struct {
AppName string `config:"app_name" default:"MyApp"`
Port int `config:"port" default:"8080"`
Debug bool `config:"debug" default:"false"`
}
type ConfigManager struct {
config interface{}
}
func (cm *ConfigManager) LoadFromMap(data map[string]string) error {
v := reflect.ValueOf(cm.config).Elem()
t := v.Type()
for i := 0; i < v.NumField(); i++ {
field := v.Field(i)
fieldType := t.Field(i)
// 获取标签值
configKey := fieldType.Tag.Get("config")
defaultValue := fieldType.Tag.Get("default")
// 根据字段类型设置值
valueStr := data[configKey]
if valueStr == "" {
valueStr = defaultValue
}
// 类型转换和设值逻辑
switch field.Kind() {
case reflect.String:
field.SetString(valueStr)
case reflect.Int:
if value, err := strconv.Atoi(valueStr); err == nil {
field.SetInt(int64(value))
}
case reflect.Bool:
value := strings.ToLower(valueStr) == "true"
field.SetBool(value)
}
}
return nil
}
// 使用示例
func main() {
config := &Config{}
manager := NewConfigManager(config)
configData := map[string]string{
"app_name": "MyAwesomeApp",
"port": "9090",
}
manager.LoadFromMap(configData)
fmt.Printf("应用: %s, 端口: %d\n", config.AppName, config.Port)
}
动态方法调用补全
// 为Config添加方法
func (c *Config) UpdatePort(newPort int) (int, int) {
old := c.Port
c.Port = newPort
return old, c.Port
}
func (c *Config) GetAppInfo() string {
return fmt.Sprintf("App: %s, Port: %d, Debug: %t", c.AppName, c.Port, c.Debug)
}
// 在ConfigManager中添加CallMethod实现
func (cm *ConfigManager) CallMethod(methodName string, args ...interface{}) []interface{} {
v := reflect.ValueOf(cm.config)
// 如果config不是指针,需要获取指针才能调用指针接收者方法
if v.Kind() != reflect.Ptr {
v = v.Addr()
}
method := v.MethodByName(methodName)
if !method.IsValid() {
return []interface{}{fmt.Errorf("方法 %s 不存在", methodName)}
}
in := make([]reflect.Value, len(args))
for i, arg := range args {
in[i] = reflect.ValueOf(arg)
}
out := method.Call(in)
results := make([]interface{}, len(out))
for i, value := range out {
results[i] = value.Interface()
}
return results
}
// 使用示例
func main() {
config := &Config{AppName: "TestApp", Port: 8080, Debug: true}
manager := NewConfigManager(config)
// 调用UpdatePort方法
results := manager.CallMethod("UpdatePort", 9090)
if len(results) == 2 {
oldPort, newPort := results[0].(int), results[1].(int)
fmt.Printf("端口更新: %d -> %d\n", oldPort, newPort)
}
// 调用GetAppInfo方法
results = manager.CallMethod("GetAppInfo")
if len(results) > 0 {
appInfo := results[0].(string)
fmt.Println(appInfo) // 输出: App: TestApp, Port: 9090, Debug: true
}
}
### 4. 其他用法
动态创建对象
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string
Age int
}
// 反射创建实例函数
func createInstance(t reflect.Type) interface{} {
return reflect.New(t).Interface()
}
func main() {
// 获取Person的类型
personType := reflect.TypeOf(Person{})
// 使用反射创建Person实例
instance := createInstance(personType)
// 类型断言为*Person
if person, ok := instance.(*Person); ok {
person.Name = "张三"
person.Age = 25
fmt.Printf("创建成功: %+v\n", person)
fmt.Printf("类型: %T\n", person)
}
}
### 5. 课程总结
TypeOf()、ValueOf()、MethodByName()、Call()