Skip to content

Go反射基础详解 - Golang反射机制面试题

Go反射提供了程序运行时检查和操作类型、值的能力。虽然功能强大,但使用复杂且有性能开销,掌握反射的基础概念对于深入理解Go语言至关重要。

📋 重点面试题

面试题 1:反射的基础概念和三法则

难度级别:⭐⭐⭐⭐⭐
考察范围:反射机制/类型系统
技术标签reflection type system interface{} reflect.Type reflect.Value

详细解答

1. 反射基础概念

点击查看完整代码实现
点击查看完整代码实现
go
package main

import (
    "fmt"
    "reflect"
    "strconv"
    "time"
    "unsafe"
)

func demonstrateReflectionBasics() {
    fmt.Println("=== Go反射基础概念演示 ===")
    
    /*
    反射基础概念:
    
    1. 反射三法则:
       - 从接口值到反射对象
       - 从反射对象到接口值
       - 要修改反射对象,其值必须可设置
    
    2. 核心类型:
       - reflect.Type: 表示类型信息
       - reflect.Value: 表示值信息
       - reflect.Kind: 表示底层类型类别
    
    3. 获取反射对象:
       - reflect.TypeOf(): 获取类型信息
       - reflect.ValueOf(): 获取值信息
    
    4. 类型和值的关系:
       - 每个Go值都有类型和值
       - 接口值包含(type, value)对
       - 反射可以解构接口值
    */
    
    demonstrateReflectionLaws()
    demonstrateTypeAndValue()
    demonstrateKindAndType()
    demonstrateInterfaceConversion()
}

func demonstrateReflectionLaws() {
    fmt.Println("\n--- 反射三法则演示 ---")
    
    /*
    反射三法则详解:
    
    法则1:从接口值到反射对象
    - interface{} -> reflect.Type/reflect.Value
    - 任何值都可以转换为interface{}
    - 通过TypeOf和ValueOf获取反射对象
    
    法则2:从反射对象到接口值
    - reflect.Value -> interface{}
    - 通过Interface()方法转换
    - 需要类型断言获取具体类型
    
    法则3:要修改反射对象,其值必须可设置
    - 必须通过指针获取可设置的值
    - 使用Elem()获取指针指向的值
    - CanSet()检查是否可设置
    */
    
    // 法则1:从接口值到反射对象
    demonstrateLaw1 := func() {
        fmt.Println("法则1:从接口值到反射对象")
        
        var x float64 = 3.4
        
        // 获取类型信息
        t := reflect.TypeOf(x)
        fmt.Printf("  类型: %v\n", t)
        fmt.Printf("  类型名称: %s\n", t.Name())
        fmt.Printf("  类型种类: %v\n", t.Kind())
        
        // 获取值信息
        v := reflect.ValueOf(x)
        fmt.Printf("  值: %v\n", v)
        fmt.Printf("  值的类型: %s\n", v.Type())
        fmt.Printf("  值的种类: %v\n", v.Kind())
        fmt.Printf("  是否可设置: %t\n", v.CanSet())
        
        // 复杂类型示例
        type Person struct {
            Name string
            Age  int
        }
        
        p := Person{Name: "Alice", Age: 30}
        pType := reflect.TypeOf(p)
        pValue := reflect.ValueOf(p)
        
        fmt.Printf("  结构体类型: %v\n", pType)
        fmt.Printf("  结构体值: %v\n", pValue)
        fmt.Printf("  字段数量: %d\n", pType.NumField())
        
        // 遍历字段
        for i := 0; i < pType.NumField(); i++ {
            field := pType.Field(i)
            value := pValue.Field(i)
            fmt.Printf("    字段%d: %s %s = %v\n", 
                i, field.Name, field.Type, value.Interface())
        }
    }
    
    // 法则2:从反射对象到接口值
    demonstrateLaw2 := func() {
        fmt.Println("\n法则2:从反射对象到接口值")
        
        var x float64 = 3.4
        v := reflect.ValueOf(x)
        
        // 转换回interface{}
        y := v.Interface()
        fmt.Printf("  原始值: %v (类型: %T)\n", x, x)
        fmt.Printf("  反射后转换: %v (类型: %T)\n", y, y)
        
        // 类型断言获取具体类型
        if f, ok := y.(float64); ok {
            fmt.Printf("  类型断言成功: %v\n", f)
        }
        
        // 处理不同类型
        values := []interface{}{
            42,
            "hello",
            []int{1, 2, 3},
            map[string]int{"a": 1, "b": 2},
        }
        
        for i, val := range values {
            v := reflect.ValueOf(val)
            recovered := v.Interface()
            fmt.Printf("  示例%d: %v -> %v (种类: %v)\n", 
                i+1, val, recovered, v.Kind())
        }
    }
    
    // 法则3:修改反射对象
    demonstrateLaw3 := func() {
        fmt.Println("\n法则3:修改反射对象")
        
        // 错误示例:不可设置的值
        var x float64 = 3.4
        v := reflect.ValueOf(x)
        fmt.Printf("  直接传值 CanSet: %t\n", v.CanSet())
        
        // 正确示例:通过指针传递
        p := reflect.ValueOf(&x)
        fmt.Printf("  传指针 CanSet: %t\n", p.CanSet())
        
        // 获取指针指向的元素
        elem := p.Elem()
        fmt.Printf("  指针元素 CanSet: %t\n", elem.CanSet())
        
        // 修改值
        if elem.CanSet() {
            elem.SetFloat(7.1)
            fmt.Printf("  修改后的值: %v\n", x)
        }
        
        // 结构体字段修改
        type Person struct {
            Name string
            Age  int
            private string // 私有字段
        }
        
        person := Person{Name: "Alice", Age: 30, private: "secret"}
        personPtr := reflect.ValueOf(&person)
        personElem := personPtr.Elem()
        
        fmt.Printf("  修改前: %+v\n", person)
        
        // 修改公有字段
        nameField := personElem.FieldByName("Name")
        if nameField.CanSet() {
            nameField.SetString("Bob")
        }
        
        ageField := personElem.FieldByName("Age")
        if ageField.CanSet() {
            ageField.SetInt(35)
        }
        
        // 尝试修改私有字段
        privateField := personElem.FieldByName("private")
        fmt.Printf("  私有字段 CanSet: %t\n", privateField.CanSet())
        
        fmt.Printf("  修改后: %+v\n", person)
    }
    
    demonstrateLaw1()
    demonstrateLaw2()
    demonstrateLaw3()
}

func demonstrateTypeAndValue() {
    fmt.Println("\n--- 类型和值的详细操作 ---")
    
    /*
    Type和Value的详细操作:
    
    1. Type操作:
       - 基本信息:Name(), Kind(), Size()
       - 结构体:NumField(), Field(), FieldByName()
       - 函数:NumIn(), NumOut(), In(), Out()
       - 指针/切片:Elem()
    
    2. Value操作:
       - 基本信息:Type(), Kind(), Interface()
       - 容器:Len(), Cap(), Index(), Slice()
       - 字段/方法:Field(), Method(), Call()
       - 修改:Set*(), CanSet()
    */
    
    // 详细的Type操作
    demonstrateTypeOperations := func() {
        fmt.Println("Type操作详解:")
        
        // 基础类型
        var num int = 42
        numType := reflect.TypeOf(num)
        
        fmt.Printf("  基础类型信息:\n")
        fmt.Printf("    名称: %s\n", numType.Name())
        fmt.Printf("    种类: %v\n", numType.Kind())
        fmt.Printf("    大小: %d 字节\n", numType.Size())
        fmt.Printf("    字符串表示: %s\n", numType.String())
        
        // 结构体类型
        type Employee struct {
            ID       int    `json:"id" db:"employee_id"`
            Name     string `json:"name" db:"full_name"`
            Email    string `json:"email" db:"email_address"`
            Salary   float64 `json:"salary" db:"salary"`
            IsActive bool   `json:"is_active" db:"active"`
        }
        
        emp := Employee{}
        empType := reflect.TypeOf(emp)
        
        fmt.Printf("\n  结构体类型信息:\n")
        fmt.Printf("    名称: %s\n", empType.Name())
        fmt.Printf("    包路径: %s\n", empType.PkgPath())
        fmt.Printf("    字段数量: %d\n", empType.NumField())
        
        // 遍历字段
        for i := 0; i < empType.NumField(); i++ {
            field := empType.Field(i)
            fmt.Printf("    字段%d: %s %s\n", i, field.Name, field.Type)
            fmt.Printf("      JSON标签: %s\n", field.Tag.Get("json"))
            fmt.Printf("      DB标签: %s\n", field.Tag.Get("db"))
            fmt.Printf("      偏移量: %d\n", field.Offset)
        }
        
        // 按名称查找字段
        if nameField, found := empType.FieldByName("Name"); found {
            fmt.Printf("    Name字段类型: %s\n", nameField.Type)
        }
        
        // 函数类型
        fn := func(a int, b string) (string, error) {
            return fmt.Sprintf("%d-%s", a, b), nil
        }
        
        fnType := reflect.TypeOf(fn)
        fmt.Printf("\n  函数类型信息:\n")
        fmt.Printf("    输入参数数量: %d\n", fnType.NumIn())
        fmt.Printf("    输出参数数量: %d\n", fnType.NumOut())
        
        for i := 0; i < fnType.NumIn(); i++ {
            fmt.Printf("    输入参数%d: %s\n", i, fnType.In(i))
        }
        
        for i := 0; i < fnType.NumOut(); i++ {
            fmt.Printf("    输出参数%d: %s\n", i, fnType.Out(i))
        }
    }
    
    // 详细的Value操作
    demonstrateValueOperations := func() {
        fmt.Println("\nValue操作详解:")
        
        // 切片操作
        numbers := []int{1, 2, 3, 4, 5}
        numbersValue := reflect.ValueOf(numbers)
        
        fmt.Printf("  切片操作:\n")
        fmt.Printf("    长度: %d\n", numbersValue.Len())
        fmt.Printf("    容量: %d\n", numbersValue.Cap())
        fmt.Printf("    类型: %s\n", numbersValue.Type())
        
        // 访问元素
        for i := 0; i < numbersValue.Len(); i++ {
            elem := numbersValue.Index(i)
            fmt.Printf("    元素%d: %v (类型: %s)\n", i, elem.Interface(), elem.Type())
        }
        
        // 切片操作
        slice := numbersValue.Slice(1, 4)
        fmt.Printf("    切片[1:4]: %v\n", slice.Interface())
        
        // Map操作
        userMap := map[string]int{
            "alice": 25,
            "bob":   30,
            "carol": 35,
        }
        
        mapValue := reflect.ValueOf(userMap)
        fmt.Printf("\n  Map操作:\n")
        fmt.Printf("    长度: %d\n", mapValue.Len())
        fmt.Printf("    类型: %s\n", mapValue.Type())
        
        // 遍历Map
        for _, key := range mapValue.MapKeys() {
            value := mapValue.MapIndex(key)
            fmt.Printf("    %v: %v\n", key.Interface(), value.Interface())
        }
        
        // 结构体方法调用
        type Calculator struct {
            value float64
        }
        
        func (c Calculator) Add(x float64) float64 {
            return c.value + x
        }
        
        func (c Calculator) Multiply(x float64) float64 {
            return c.value * x
        }
        
        func (c Calculator) GetInfo() string {
            return fmt.Sprintf("Calculator with value: %.2f", c.value)
        }
        
        calc := Calculator{value: 10.0}
        calcValue := reflect.ValueOf(calc)
        calcType := reflect.TypeOf(calc)
        
        fmt.Printf("\n  方法调用:\n")
        fmt.Printf("    方法数量: %d\n", calcType.NumMethod())
        
        // 遍历方法
        for i := 0; i < calcType.NumMethod(); i++ {
            method := calcType.Method(i)
            fmt.Printf("    方法%d: %s %s\n", i, method.Name, method.Type)
        }
        
        // 调用无参数方法
        getInfoMethod := calcValue.MethodByName("GetInfo")
        if getInfoMethod.IsValid() {
            results := getInfoMethod.Call(nil)
            fmt.Printf("    GetInfo(): %v\n", results[0].Interface())
        }
        
        // 调用有参数方法
        addMethod := calcValue.MethodByName("Add")
        if addMethod.IsValid() {
            args := []reflect.Value{reflect.ValueOf(5.0)}
            results := addMethod.Call(args)
            fmt.Printf("    Add(5.0): %v\n", results[0].Interface())
        }
    }
    
    demonstrateTypeOperations()
    demonstrateValueOperations()
}

func demonstrateKindAndType() {
    fmt.Println("\n--- Kind和Type的区别 ---")
    
    /*
    Kind vs Type区别:
    
    1. Type: 具体的类型信息
       - 自定义类型有自己的名称
       - 包含包路径信息
       - 更具体的类型描述
    
    2. Kind: 底层类型类别
       - Go语言内置的基本类别
       - 有限的预定义值
       - 更抽象的分类
    
    3. 常见Kind值:
       - 基本类型:Int, Float64, String, Bool
       - 复合类型:Array, Slice, Map, Chan, Struct
       - 引用类型:Ptr, Interface, Func
    */
    
    demonstrateTypeKindDifference := func() {
        fmt.Println("Type和Kind的区别:")
        
        // 自定义类型
        type UserID int
        type UserName string
        type UserAge int
        
        type User struct {
            ID   UserID
            Name UserName
            Age  UserAge
        }
        
        var userID UserID = 123
        var userName UserName = "Alice"
        var user User = User{ID: 123, Name: "Alice", Age: 25}
        
        examples := []interface{}{
            userID,
            userName,
            user,
            123,           // int
            "Alice",       // string
            []int{1, 2, 3}, // slice
            map[string]int{"a": 1}, // map
            func() {},     // func
            make(chan int), // chan
        }
        
        fmt.Printf("  %-15s %-20s %-15s %-15s\n", "值", "Type", "Type.Name()", "Kind")
        fmt.Printf("  %s\n", "─────────────────────────────────────────────────────────────────")
        
        for _, val := range examples {
            t := reflect.TypeOf(val)
            v := reflect.ValueOf(val)
            
            fmt.Printf("  %-15v %-20s %-15s %-15s\n", 
                val, t.String(), t.Name(), t.Kind())
            
            // 对于复合类型,显示更多信息
            if v.Kind() == reflect.Slice {
                elemType := t.Elem()
                fmt.Printf("    → 元素类型: %s (Kind: %s)\n", elemType, elemType.Kind())
            } else if v.Kind() == reflect.Map {
                keyType := t.Key()
                elemType := t.Elem()
                fmt.Printf("    → 键类型: %s, 值类型: %s\n", keyType, elemType)
            } else if v.Kind() == reflect.Chan {
                elemType := t.Elem()
                fmt.Printf("    → 元素类型: %s, 方向: %s\n", elemType, t.ChanDir())
            }
        }
    }
    
    // Kind判断和类型检查
    demonstrateKindChecking := func() {
        fmt.Println("\nKind判断和类型检查:")
        
        values := []interface{}{
            42,
            "hello",
            []int{1, 2, 3},
            map[string]int{"a": 1},
            struct{ Name string }{Name: "test"},
            func() string { return "test" },
            make(chan int),
            &[]int{1, 2, 3},
        }
        
        for i, val := range values {
            v := reflect.ValueOf(val)
            t := v.Type()
            
            fmt.Printf("  值%d: %v\n", i+1, val)
            fmt.Printf("    Kind: %s\n", v.Kind())
            
            // 根据Kind执行不同操作
            switch v.Kind() {
            case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
                fmt.Printf("    → 整数值: %d\n", v.Int())
                
            case reflect.String:
                fmt.Printf("    → 字符串长度: %d\n", len(v.String()))
                
            case reflect.Slice:
                fmt.Printf("    → 切片长度: %d, 容量: %d\n", v.Len(), v.Cap())
                
            case reflect.Map:
                fmt.Printf("    → Map长度: %d\n", v.Len())
                for _, key := range v.MapKeys() {
                    value := v.MapIndex(key)
                    fmt.Printf("      %v: %v\n", key.Interface(), value.Interface())
                }
                
            case reflect.Struct:
                fmt.Printf("    → 结构体字段数: %d\n", v.NumField())
                for j := 0; j < v.NumField(); j++ {
                    field := t.Field(j)
                    fieldValue := v.Field(j)
                    fmt.Printf("      %s: %v\n", field.Name, fieldValue.Interface())
                }
                
            case reflect.Func:
                fmt.Printf("    → 函数类型: %s\n", t)
                
            case reflect.Chan:
                fmt.Printf("    → 通道类型: %s\n", t)
                
            case reflect.Ptr:
                fmt.Printf("    → 指针指向: %s\n", t.Elem())
                if !v.IsNil() {
                    elem := v.Elem()
                    fmt.Printf("      指向的值: %v\n", elem.Interface())
                }
            }
            
            fmt.Println()
        }
    }
    
    demonstrateTypeKindDifference()
    demonstrateKindChecking()
}

func demonstrateInterfaceConversion() {
    fmt.Println("\n--- 接口转换和类型断言 ---")
    
    /*
    接口转换和类型断言:
    
    1. 接口值构成:
       - 类型信息(type)
       - 值信息(value)
       - nil接口:type=nil, value=nil
    
    2. 类型断言:
       - 直接断言:v.(Type)
       - 安全断言:v.(Type), ok
       - 类型switch:switch v.(type)
    
    3. 反射中的接口处理:
       - Interface()方法获取接口值
       - IsNil()检查nil值
       - 类型转换和检查
    */
    
    demonstrateInterfaceStructure := func() {
        fmt.Println("接口值结构分析:")
        
        var emptyInterface interface{}
        
        // nil接口
        fmt.Printf("  nil接口:\n")
        if emptyInterface == nil {
            fmt.Printf("    接口为nil\n")
        }
        
        // 不同类型的接口值
        values := []interface{}{
            42,
            "hello",
            []int{1, 2, 3},
            (*int)(nil), // nil指针
            error(nil),  // nil error接口
        }
        
        for i, val := range values {
            fmt.Printf("  接口值%d: %v\n", i+1, val)
            
            v := reflect.ValueOf(val)
            if !v.IsValid() {
                fmt.Printf("    反射值无效\n")
                continue
            }
            
            t := v.Type()
            fmt.Printf("    类型: %s\n", t)
            fmt.Printf("    Kind: %s\n", v.Kind())
            fmt.Printf("    IsNil: %t\n", v.IsNil() && v.CanAddr())
            
            // 获取接口值
            if v.IsValid() {
                interfaceVal := v.Interface()
                fmt.Printf("    接口值: %v (类型: %T)\n", interfaceVal, interfaceVal)
            }
            
            fmt.Println()
        }
    }
    
    // 类型断言和转换
    demonstrateTypeAssertion := func() {
        fmt.Println("类型断言和转换:")
        
        // 创建不同类型的接口值
        var values []interface{} = []interface{}{
            42,
            "hello world",
            []int{1, 2, 3, 4, 5},
            map[string]int{"a": 1, "b": 2},
            time.Now(),
            errors.New("test error"),
        }
        
        for i, val := range values {
            fmt.Printf("  值%d: %v (类型: %T)\n", i+1, val, val)
            
            v := reflect.ValueOf(val)
            
            // 使用反射进行类型检查和转换
            switch v.Kind() {
            case reflect.Int:
                // 转换为int
                if intVal, ok := val.(int); ok {
                    fmt.Printf("    → int断言成功: %d\n", intVal)
                }
                
                // 通过反射获取
                reflectInt := v.Interface().(int)
                fmt.Printf("    → 反射获取: %d\n", reflectInt)
                
            case reflect.String:
                // 字符串处理
                str := v.String()
                fmt.Printf("    → 字符串长度: %d\n", len(str))
                fmt.Printf("    → 反射字符串: %s\n", str)
                
            case reflect.Slice:
                // 切片处理
                fmt.Printf("    → 切片长度: %d\n", v.Len())
                
                // 尝试转换为[]int
                if intSlice, ok := val.([]int); ok {
                    fmt.Printf("    → []int断言成功: %v\n", intSlice)
                }
                
            case reflect.Map:
                // Map处理
                fmt.Printf("    → Map长度: %d\n", v.Len())
                
                // 尝试转换为map[string]int
                if stringIntMap, ok := val.(map[string]int); ok {
                    fmt.Printf("    → map[string]int断言成功: %v\n", stringIntMap)
                }
            }
            
            // 使用类型switch
            switch typedVal := val.(type) {
            case int:
                fmt.Printf("    → 类型switch: 整数 %d\n", typedVal)
            case string:
                fmt.Printf("    → 类型switch: 字符串 \"%s\"\n", typedVal)
            case []int:
                fmt.Printf("    → 类型switch: 整数切片 %v\n", typedVal)
            case time.Time:
                fmt.Printf("    → 类型switch: 时间 %s\n", typedVal.Format("2006-01-02 15:04:05"))
            case error:
                fmt.Printf("    → 类型switch: 错误 %s\n", typedVal.Error())
            default:
                fmt.Printf("    → 类型switch: 未知类型 %T\n", typedVal)
            }
            
            fmt.Println()
        }
    }
    
    // 接口实现检查
    demonstrateInterfaceImplementation := func() {
        fmt.Println("接口实现检查:")
        
        // 定义接口
        type Stringer interface {
            String() string
        }
        
        type Writer interface {
            Write([]byte) (int, error)
        }
        
        type Counter interface {
            Count() int
        }
        
        // 定义实现类型
        type MyInt int
        
        func (mi MyInt) String() string {
            return fmt.Sprintf("MyInt(%d)", mi)
        }
        
        type MyString string
        
        func (ms MyString) String() string {
            return string(ms)
        }
        
        func (ms MyString) Write(data []byte) (int, error) {
            return len(data), nil
        }
        
        // 测试类型
        testTypes := []interface{}{
            MyInt(42),
            MyString("hello"),
            "regular string",
            42,
        }
        
        // 检查接口实现
        stringerType := reflect.TypeOf((*Stringer)(nil)).Elem()
        writerType := reflect.TypeOf((*Writer)(nil)).Elem()
        counterType := reflect.TypeOf((*Counter)(nil)).Elem()
        
        for i, val := range testTypes {
            t := reflect.TypeOf(val)
            fmt.Printf("  类型%d: %s\n", i+1, t)
            
            // 检查是否实现了Stringer接口
            if t.Implements(stringerType) {
                fmt.Printf("    ✓ 实现了Stringer接口\n")
                if stringer, ok := val.(Stringer); ok {
                    fmt.Printf("      String(): %s\n", stringer.String())
                }
            } else {
                fmt.Printf("    ✗ 未实现Stringer接口\n")
            }
            
            // 检查是否实现了Writer接口
            if t.Implements(writerType) {
                fmt.Printf("    ✓ 实现了Writer接口\n")
            } else {
                fmt.Printf("    ✗ 未实现Writer接口\n")
            }
            
            // 检查是否实现了Counter接口
            if t.Implements(counterType) {
                fmt.Printf("    ✓ 实现了Counter接口\n")
            } else {
                fmt.Printf("    ✗ 未实现Counter接口\n")
            }
            
            fmt.Println()
        }
    }
    
    demonstrateInterfaceStructure()
    demonstrateTypeAssertion()
    demonstrateInterfaceImplementation()
}

:::

面试题 2:反射的高级应用场景

难度级别:⭐⭐⭐⭐⭐
考察范围:高级反射/元编程
技术标签meta programming dynamic programming serialization dependency injection

详细解答

1. 反射高级应用场景

点击查看完整代码实现
点击查看完整代码实现
go
func demonstrateAdvancedReflectionApplications() {
    fmt.Println("\n=== 反射高级应用场景 ===")
    
    /*
    反射高级应用场景:
    
    1. 序列化/反序列化:
       - JSON/XML编解码
       - 自定义序列化格式
       - 协议缓冲区处理
    
    2. 依赖注入:
       - 自动装配
       - 服务定位器
       - IoC容器实现
    
    3. ORM框架:
       - 对象关系映射
       - 查询构建器
       - 数据库模型绑定
    
    4. 配置管理:
       - 环境变量绑定
       - 配置文件解析
       - 参数验证
    */
    
    demonstrateCustomSerialization()
    demonstrateDependencyInjection()
    demonstrateORMMapping()
    demonstrateConfigBinding()
}

func demonstrateCustomSerialization() {
    fmt.Println("\n--- 自定义序列化器 ---")
    
    /*
    自定义序列化器实现:
    
    1. 序列化策略:
       - 类型识别和处理
       - 循环引用检测
       - 自定义编码格式
    
    2. 反序列化策略:
       - 类型重建
       - 值填充
       - 引用重建
    */
    
    // 自定义序列化器
    type CustomSerializer struct {
        visited map[uintptr]bool // 循环引用检测
    }
    
    func NewCustomSerializer() *CustomSerializer {
        return &CustomSerializer{
            visited: make(map[uintptr]bool),
        }
    }
    
    func (cs *CustomSerializer) Serialize(v interface{}) (map[string]interface{}, error) {
        cs.visited = make(map[uintptr]bool) // 重置访问记录
        return cs.serializeValue(reflect.ValueOf(v))
    }
    
    func (cs *CustomSerializer) serializeValue(v reflect.Value) (map[string]interface{}, error) {
        result := make(map[string]interface{})
        
        // 处理指针
        if v.Kind() == reflect.Ptr {
            if v.IsNil() {
                return map[string]interface{}{"type": "nil"}, nil
            }
            
            // 检查循环引用
            ptr := v.Pointer()
            if cs.visited[ptr] {
                return map[string]interface{}{
                    "type": "circular_reference",
                    "addr": fmt.Sprintf("0x%x", ptr),
                }, nil
            }
            cs.visited[ptr] = true
            
            v = v.Elem()
        }
        
        t := v.Type()
        result["type"] = t.String()
        result["kind"] = v.Kind().String()
        
        switch v.Kind() {
        case reflect.Bool:
            result["value"] = v.Bool()
            
        case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
            result["value"] = v.Int()
            
        case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
            result["value"] = v.Uint()
            
        case reflect.Float32, reflect.Float64:
            result["value"] = v.Float()
            
        case reflect.String:
            result["value"] = v.String()
            
        case reflect.Slice, reflect.Array:
            var elements []interface{}
            for i := 0; i < v.Len(); i++ {
                elem, err := cs.serializeValue(v.Index(i))
                if err != nil {
                    return nil, err
                }
                elements = append(elements, elem)
            }
            result["elements"] = elements
            result["length"] = v.Len()
            if v.Kind() == reflect.Slice {
                result["capacity"] = v.Cap()
            }
            
        case reflect.Map:
            mapData := make(map[string]interface{})
            for _, key := range v.MapKeys() {
                keyStr := fmt.Sprintf("%v", key.Interface())
                value, err := cs.serializeValue(v.MapIndex(key))
                if err != nil {
                    return nil, err
                }
                mapData[keyStr] = value
            }
            result["map_data"] = mapData
            
        case reflect.Struct:
            fields := make(map[string]interface{})
            for i := 0; i < v.NumField(); i++ {
                field := t.Field(i)
                if !field.IsExported() {
                    continue // 跳过私有字段
                }
                
                fieldValue, err := cs.serializeValue(v.Field(i))
                if err != nil {
                    return nil, err
                }
                fields[field.Name] = fieldValue
            }
            result["fields"] = fields
            
        default:
            result["value"] = fmt.Sprintf("%v", v.Interface())
        }
        
        return result, nil
    }
    
    // 测试自定义序列化
    type Address struct {
        Street string
        City   string
        Zip    string
    }
    
    type Person struct {
        Name    string
        Age     int
        Address *Address
        Hobbies []string
        Scores  map[string]int
    }
    
    person := &Person{
        Name: "Alice",
        Age:  30,
        Address: &Address{
            Street: "123 Main St",
            City:   "Anytown",
            Zip:    "12345",
        },
        Hobbies: []string{"reading", "swimming", "coding"},
        Scores:  map[string]int{"math": 95, "english": 87, "science": 92},
    }
    
    serializer := NewCustomSerializer()
    serialized, err := serializer.Serialize(person)
    if err != nil {
        fmt.Printf("序列化失败: %v\n", err)
        return
    }
    
    fmt.Printf("自定义序列化结果:\n")
    printNestedMap(serialized, "  ")
    
    // 处理循环引用
    type Node struct {
        Value int
        Next  *Node
    }
    
    node1 := &Node{Value: 1}
    node2 := &Node{Value: 2}
    node1.Next = node2
    node2.Next = node1 // 创建循环引用
    
    fmt.Printf("\n循环引用序列化:\n")
    circularSerialized, err := serializer.Serialize(node1)
    if err != nil {
        fmt.Printf("序列化失败: %v\n", err)
    } else {
        printNestedMap(circularSerialized, "  ")
    }
}

func printNestedMap(m map[string]interface{}, indent string) {
    for key, value := range m {
        switch v := value.(type) {
        case map[string]interface{}:
            fmt.Printf("%s%s:\n", indent, key)
            printNestedMap(v, indent+"  ")
        case []interface{}:
            fmt.Printf("%s%s: [\n", indent, key)
            for i, item := range v {
                if itemMap, ok := item.(map[string]interface{}); ok {
                    fmt.Printf("%s  [%d]:\n", indent, i)
                    printNestedMap(itemMap, indent+"    ")
                } else {
                    fmt.Printf("%s  [%d]: %v\n", indent, i, item)
                }
            }
            fmt.Printf("%s]\n", indent)
        default:
            fmt.Printf("%s%s: %v\n", indent, key, v)
        }
    }
}

func demonstrateDependencyInjection() {
    fmt.Println("\n--- 依赖注入容器 ---")
    
    /*
    依赖注入容器实现:
    
    1. 服务注册:
       - 按类型注册
       - 按名称注册
       - 单例/多例模式
    
    2. 依赖解析:
       - 构造函数注入
       - 字段注入
       - 循环依赖检测
    */
    
    // 依赖注入容器
    type DIContainer struct {
        services   map[reflect.Type]interface{}
        singletons map[reflect.Type]interface{}
        factories  map[reflect.Type]func() interface{}
    }
    
    func NewDIContainer() *DIContainer {
        return &DIContainer{
            services:   make(map[reflect.Type]interface{}),
            singletons: make(map[reflect.Type]interface{}),
            factories:  make(map[reflect.Type]func() interface{}),
        }
    }
    
    func (di *DIContainer) RegisterSingleton(serviceType interface{}, instance interface{}) {
        t := reflect.TypeOf(serviceType).Elem() // 获取接口类型
        di.singletons[t] = instance
    }
    
    func (di *DIContainer) RegisterFactory(serviceType interface{}, factory func() interface{}) {
        t := reflect.TypeOf(serviceType).Elem()
        di.factories[t] = factory
    }
    
    func (di *DIContainer) Register(serviceType interface{}, implementation interface{}) {
        t := reflect.TypeOf(serviceType).Elem()
        di.services[t] = implementation
    }
    
    func (di *DIContainer) Resolve(serviceType interface{}) interface{} {
        t := reflect.TypeOf(serviceType).Elem()
        
        // 检查单例
        if singleton, exists := di.singletons[t]; exists {
            return singleton
        }
        
        // 检查工厂
        if factory, exists := di.factories[t]; exists {
            return factory()
        }
        
        // 检查注册的服务
        if service, exists := di.services[t]; exists {
            return service
        }
        
        return nil
    }
    
    func (di *DIContainer) Inject(target interface{}) error {
        v := reflect.ValueOf(target)
        if v.Kind() != reflect.Ptr || v.Elem().Kind() != reflect.Struct {
            return fmt.Errorf("target must be a pointer to struct")
        }
        
        elem := v.Elem()
        t := elem.Type()
        
        for i := 0; i < elem.NumField(); i++ {
            field := elem.Field(i)
            fieldType := t.Field(i)
            
            // 检查是否有inject标签
            if tag := fieldType.Tag.Get("inject"); tag != "" {
                if !field.CanSet() {
                    continue
                }
                
                // 根据字段类型解析依赖
                dependency := di.Resolve(field.Type())
                if dependency != nil {
                    dependencyValue := reflect.ValueOf(dependency)
                    if dependencyValue.Type().AssignableTo(field.Type()) {
                        field.Set(dependencyValue)
                    }
                }
            }
        }
        
        return nil
    }
    
    // 定义服务接口和实现
    type Logger interface {
        Log(message string)
    }
    
    type ConsoleLogger struct {
        prefix string
    }
    
    func (cl *ConsoleLogger) Log(message string) {
        fmt.Printf("[%s] %s\n", cl.prefix, message)
    }
    
    type Database interface {
        Query(sql string) string
    }
    
    type MockDatabase struct {
        connected bool
    }
    
    func (db *MockDatabase) Query(sql string) string {
        if !db.connected {
            return "Not connected"
        }
        return fmt.Sprintf("Result for: %s", sql)
    }
    
    type UserService struct {
        Logger   Logger   `inject:"true"`
        Database Database `inject:"true"`
    }
    
    func (us *UserService) GetUser(id int) string {
        us.Logger.Log(fmt.Sprintf("Getting user %d", id))
        result := us.Database.Query(fmt.Sprintf("SELECT * FROM users WHERE id = %d", id))
        return result
    }
    
    // 测试依赖注入
    container := NewDIContainer()
    
    // 注册服务
    logger := &ConsoleLogger{prefix: "APP"}
    database := &MockDatabase{connected: true}
    
    container.RegisterSingleton((*Logger)(nil), logger)
    container.RegisterSingleton((*Database)(nil), database)
    
    // 创建需要注入的服务
    userService := &UserService{}
    
    fmt.Printf("注入前:\n")
    fmt.Printf("  Logger: %v\n", userService.Logger)
    fmt.Printf("  Database: %v\n", userService.Database)
    
    // 执行依赖注入
    err := container.Inject(userService)
    if err != nil {
        fmt.Printf("依赖注入失败: %v\n", err)
        return
    }
    
    fmt.Printf("\n注入后:\n")
    fmt.Printf("  Logger: %v\n", userService.Logger)
    fmt.Printf("  Database: %v\n", userService.Database)
    
    // 测试注入的服务
    fmt.Printf("\n测试服务:\n")
    result := userService.GetUser(123)
    fmt.Printf("  查询结果: %s\n", result)
}

func demonstrateORMMapping() {
    fmt.Println("\n--- ORM对象映射 ---")
    
    /*
    ORM对象映射实现:
    
    1. 模型定义:
       - 字段映射
       - 关联关系
       - 约束条件
    
    2. 查询构建:
       - 动态SQL生成
       - 参数绑定
       - 结果映射
    */
    
    // 简单的ORM映射器
    type ORMMapper struct {
        tableName string
        fields    map[string]string // Go字段名 -> 数据库字段名
    }
    
    func NewORMMapper(model interface{}) *ORMMapper {
        t := reflect.TypeOf(model)
        if t.Kind() == reflect.Ptr {
            t = t.Elem()
        }
        
        mapper := &ORMMapper{
            fields: make(map[string]string),
        }
        
        // 获取表名
        if tableName := getTableName(t); tableName != "" {
            mapper.tableName = tableName
        } else {
            mapper.tableName = strings.ToLower(t.Name()) + "s"
        }
        
        // 映射字段
        for i := 0; i < t.NumField(); i++ {
            field := t.Field(i)
            
            if !field.IsExported() {
                continue
            }
            
            dbField := field.Tag.Get("db")
            if dbField == "" {
                dbField = strings.ToLower(field.Name)
            }
            
            mapper.fields[field.Name] = dbField
        }
        
        return mapper
    }
    
    func getTableName(t reflect.Type) string {
        // 可以通过标签或方法获取表名
        return ""
    }
    
    func (orm *ORMMapper) BuildSelectSQL(conditions map[string]interface{}) string {
        var fields []string
        for _, dbField := range orm.fields {
            fields = append(fields, dbField)
        }
        
        sql := fmt.Sprintf("SELECT %s FROM %s", strings.Join(fields, ", "), orm.tableName)
        
        if len(conditions) > 0 {
            var whereClauses []string
            for field, value := range conditions {
                if dbField, exists := orm.fields[field]; exists {
                    whereClauses = append(whereClauses, fmt.Sprintf("%s = %v", dbField, value))
                }
            }
            
            if len(whereClauses) > 0 {
                sql += " WHERE " + strings.Join(whereClauses, " AND ")
            }
        }
        
        return sql
    }
    
    func (orm *ORMMapper) BuildInsertSQL(model interface{}) string {
        v := reflect.ValueOf(model)
        if v.Kind() == reflect.Ptr {
            v = v.Elem()
        }
        
        var fields []string
        var values []string
        
        for i := 0; i < v.NumField(); i++ {
            field := v.Type().Field(i)
            if !field.IsExported() {
                continue
            }
            
            dbField := orm.fields[field.Name]
            fieldValue := v.Field(i)
            
            fields = append(fields, dbField)
            values = append(values, fmt.Sprintf("'%v'", fieldValue.Interface()))
        }
        
        return fmt.Sprintf("INSERT INTO %s (%s) VALUES (%s)", 
            orm.tableName, strings.Join(fields, ", "), strings.Join(values, ", "))
    }
    
    func (orm *ORMMapper) ScanRow(dest interface{}, row map[string]interface{}) error {
        v := reflect.ValueOf(dest)
        if v.Kind() != reflect.Ptr || v.Elem().Kind() != reflect.Struct {
            return fmt.Errorf("dest must be a pointer to struct")
        }
        
        elem := v.Elem()
        t := elem.Type()
        
        for i := 0; i < elem.NumField(); i++ {
            field := elem.Field(i)
            fieldType := t.Field(i)
            
            if !fieldType.IsExported() || !field.CanSet() {
                continue
            }
            
            dbField := orm.fields[fieldType.Name]
            if value, exists := row[dbField]; exists {
                if err := setFieldValue(field, value); err != nil {
                    return fmt.Errorf("failed to set field %s: %v", fieldType.Name, err)
                }
            }
        }
        
        return nil
    }
    
    func setFieldValue(field reflect.Value, value interface{}) error {
        valueType := reflect.TypeOf(value)
        fieldType := field.Type()
        
        if valueType.AssignableTo(fieldType) {
            field.Set(reflect.ValueOf(value))
            return nil
        }
        
        // 尝试类型转换
        switch field.Kind() {
        case reflect.String:
            field.SetString(fmt.Sprintf("%v", value))
        case reflect.Int, reflect.Int64:
            if intVal, err := strconv.ParseInt(fmt.Sprintf("%v", value), 10, 64); err == nil {
                field.SetInt(intVal)
            } else {
                return err
            }
        case reflect.Float64:
            if floatVal, err := strconv.ParseFloat(fmt.Sprintf("%v", value), 64); err == nil {
                field.SetFloat(floatVal)
            } else {
                return err
            }
        case reflect.Bool:
            if boolVal, err := strconv.ParseBool(fmt.Sprintf("%v", value)); err == nil {
                field.SetBool(boolVal)
            } else {
                return err
            }
        default:
            return fmt.Errorf("unsupported field type: %s", field.Type())
        }
        
        return nil
    }
    
    // 定义模型
    type User struct {
        ID       int    `db:"user_id"`
        Username string `db:"username"`
        Email    string `db:"email"`
        Age      int    `db:"age"`
        IsActive bool   `db:"is_active"`
    }
    
    // 测试ORM映射
    user := User{
        ID:       1,
        Username: "alice",
        Email:    "alice@example.com",
        Age:      30,
        IsActive: true,
    }
    
    mapper := NewORMMapper(user)
    
    fmt.Printf("ORM映射测试:\n")
    fmt.Printf("  表名: %s\n", mapper.tableName)
    fmt.Printf("  字段映射:\n")
    for goField, dbField := range mapper.fields {
        fmt.Printf("    %s -> %s\n", goField, dbField)
    }
    
    // 生成SQL
    selectSQL := mapper.BuildSelectSQL(map[string]interface{}{
        "Username": "alice",
        "IsActive": true,
    })
    fmt.Printf("\n  SELECT SQL: %s\n", selectSQL)
    
    insertSQL := mapper.BuildInsertSQL(user)
    fmt.Printf("  INSERT SQL: %s\n", insertSQL)
    
    // 模拟数据库行
    dbRow := map[string]interface{}{
        "user_id":   2,
        "username":  "bob",
        "email":     "bob@example.com",
        "age":       "25", // 字符串形式的数字
        "is_active": "true", // 字符串形式的布尔值
    }
    
    // 扫描到结构体
    var scannedUser User
    err := mapper.ScanRow(&scannedUser, dbRow)
    if err != nil {
        fmt.Printf("  扫描失败: %v\n", err)
    } else {
        fmt.Printf("  扫描结果: %+v\n", scannedUser)
    }
}

func demonstrateConfigBinding() {
    fmt.Println("\n--- 配置绑定器 ---")
    
    /*
    配置绑定器实现:
    
    1. 多源配置:
       - 环境变量
       - 命令行参数
       - 配置文件
    
    2. 类型转换:
       - 字符串到各种类型的转换
       - 数组和对象解析
       - 默认值处理
    */
    
    // 配置绑定器
    type ConfigBinder struct {
        envVars map[string]string
        defaults map[string]interface{}
    }
    
    func NewConfigBinder() *ConfigBinder {
        return &ConfigBinder{
            envVars:  make(map[string]string),
            defaults: make(map[string]interface{}),
        }
    }
    
    func (cb *ConfigBinder) SetEnvVar(key, value string) {
        cb.envVars[key] = value
    }
    
    func (cb *ConfigBinder) SetDefault(key string, value interface{}) {
        cb.defaults[key] = value
    }
    
    func (cb *ConfigBinder) BindConfig(config interface{}) error {
        v := reflect.ValueOf(config)
        if v.Kind() != reflect.Ptr || v.Elem().Kind() != reflect.Struct {
            return fmt.Errorf("config must be a pointer to struct")
        }
        
        elem := v.Elem()
        t := elem.Type()
        
        for i := 0; i < elem.NumField(); i++ {
            field := elem.Field(i)
            fieldType := t.Field(i)
            
            if !fieldType.IsExported() || !field.CanSet() {
                continue
            }
            
            // 获取配置键
            configKey := fieldType.Tag.Get("config")
            if configKey == "" {
                configKey = strings.ToUpper(fieldType.Name)
            }
            
            envKey := fieldType.Tag.Get("env")
            if envKey == "" {
                envKey = configKey
            }
            
            defaultTag := fieldType.Tag.Get("default")
            
            // 优先级:环境变量 > 默认值标签 > 预设默认值
            var value interface{}
            
            if envValue, exists := cb.envVars[envKey]; exists {
                value = envValue
            } else if defaultTag != "" {
                value = defaultTag
            } else if defaultValue, exists := cb.defaults[configKey]; exists {
                value = defaultValue
            } else {
                continue // 没有配置值
            }
            
            if err := cb.setConfigField(field, value); err != nil {
                return fmt.Errorf("failed to set field %s: %v", fieldType.Name, err)
            }
        }
        
        return nil
    }
    
    func (cb *ConfigBinder) setConfigField(field reflect.Value, value interface{}) error {
        valueStr := fmt.Sprintf("%v", value)
        
        switch field.Kind() {
        case reflect.String:
            field.SetString(valueStr)
            
        case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
            if intVal, err := strconv.ParseInt(valueStr, 10, 64); err == nil {
                field.SetInt(intVal)
            } else {
                return err
            }
            
        case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
            if uintVal, err := strconv.ParseUint(valueStr, 10, 64); err == nil {
                field.SetUint(uintVal)
            } else {
                return err
            }
            
        case reflect.Float32, reflect.Float64:
            if floatVal, err := strconv.ParseFloat(valueStr, 64); err == nil {
                field.SetFloat(floatVal)
            } else {
                return err
            }
            
        case reflect.Bool:
            if boolVal, err := strconv.ParseBool(valueStr); err == nil {
                field.SetBool(boolVal)
            } else {
                return err
            }
            
        case reflect.Slice:
            return cb.setSliceField(field, valueStr)
            
        case reflect.Map:
            return cb.setMapField(field, valueStr)
            
        default:
            return fmt.Errorf("unsupported field type: %s", field.Type())
        }
        
        return nil
    }
    
    func (cb *ConfigBinder) setSliceField(field reflect.Value, value string) error {
        // 简单的逗号分隔解析
        parts := strings.Split(value, ",")
        slice := reflect.MakeSlice(field.Type(), len(parts), len(parts))
        
        for i, part := range parts {
            elem := slice.Index(i)
            if err := cb.setConfigField(elem, strings.TrimSpace(part)); err != nil {
                return err
            }
        }
        
        field.Set(slice)
        return nil
    }
    
    func (cb *ConfigBinder) setMapField(field reflect.Value, value string) error {
        // 简单的key=value;key=value解析
        if field.Type().Key().Kind() != reflect.String {
            return fmt.Errorf("only string keys supported for maps")
        }
        
        mapVal := reflect.MakeMap(field.Type())
        pairs := strings.Split(value, ";")
        
        for _, pair := range pairs {
            kv := strings.SplitN(strings.TrimSpace(pair), "=", 2)
            if len(kv) != 2 {
                continue
            }
            
            key := reflect.ValueOf(strings.TrimSpace(kv[0]))
            valueElem := reflect.New(field.Type().Elem()).Elem()
            
            if err := cb.setConfigField(valueElem, strings.TrimSpace(kv[1])); err != nil {
                return err
            }
            
            mapVal.SetMapIndex(key, valueElem)
        }
        
        field.Set(mapVal)
        return nil
    }
    
    // 定义配置结构
    type AppConfig struct {
        AppName     string            `config:"APP_NAME" env:"APP_NAME" default:"MyApp"`
        Port        int               `config:"PORT" env:"PORT" default:"8080"`
        Debug       bool              `config:"DEBUG" env:"DEBUG" default:"false"`
        Workers     int               `config:"WORKERS" env:"WORKERS" default:"4"`
        Timeout     time.Duration     `config:"TIMEOUT" env:"TIMEOUT" default:"30s"`
        Features    []string          `config:"FEATURES" env:"FEATURES" default:"auth,logging"`
        Limits      map[string]int    `config:"LIMITS" env:"LIMITS" default:"cpu=100;memory=512"`
        DatabaseURL string            `config:"DATABASE_URL" env:"DATABASE_URL"`
    }
    
    // 测试配置绑定
    binder := NewConfigBinder()
    
    // 设置环境变量
    binder.SetEnvVar("APP_NAME", "ReflectionDemo")
    binder.SetEnvVar("PORT", "9090")
    binder.SetEnvVar("DEBUG", "true")
    binder.SetEnvVar("FEATURES", "auth,logging,metrics,cache")
    binder.SetEnvVar("LIMITS", "cpu=200;memory=1024;disk=10240")
    
    // 设置默认值
    binder.SetDefault("WORKERS", 8)
    binder.SetDefault("DATABASE_URL", "localhost:5432/myapp")
    
    var config AppConfig
    
    fmt.Printf("配置绑定测试:\n")
    fmt.Printf("  绑定前: %+v\n", config)
    
    err := binder.BindConfig(&config)
    if err != nil {
        fmt.Printf("  绑定失败: %v\n", err)
        return
    }
    
    fmt.Printf("  绑定后: %+v\n", config)
    
    // 验证配置值
    fmt.Printf("\n  配置验证:\n")
    fmt.Printf("    应用名称: %s\n", config.AppName)
    fmt.Printf("    端口: %d\n", config.Port)
    fmt.Printf("    调试模式: %t\n", config.Debug)
    fmt.Printf("    工作线程: %d\n", config.Workers)
    fmt.Printf("    功能列表: %v\n", config.Features)
    fmt.Printf("    资源限制: %v\n", config.Limits)
    fmt.Printf("    数据库URL: %s\n", config.DatabaseURL)
}

func main() {
    demonstrateReflectionBasics()
    demonstrateAdvancedReflectionApplications()
}

:::

🎯 核心知识点总结

反射三法则要点

  1. 接口值到反射对象: 通过TypeOf()和ValueOf()获取反射信息
  2. 反射对象到接口值: 通过Interface()方法转换回去
  3. 修改反射对象: 必须通过指针获取可设置的值

Type和Value操作要点

  1. Type操作: Name()、Kind()、NumField()、Field()等类型信息
  2. Value操作: Interface()、Set*()、Call()等值操作
  3. Kind vs Type: Kind是底层类别,Type是具体类型
  4. 可设置性: CanSet()检查,Elem()获取指针元素

接口和类型断言要点

  1. 接口值构成: (type, value)对的组合
  2. 类型断言: 直接断言和安全断言的使用
  3. 接口实现检查: Implements()方法验证接口实现
  4. 类型switch: 根据具体类型执行不同逻辑

高级应用要点

  1. 序列化: 自定义序列化格式和循环引用处理
  2. 依赖注入: 自动装配和服务定位器模式
  3. ORM映射: 对象关系映射和动态SQL生成
  4. 配置绑定: 多源配置和类型转换处理

🔍 面试准备建议

  1. 理解原理: 深入理解反射的底层机制和实现原理
  2. 掌握API: 熟练使用reflect包的各种方法和类型
  3. 实际应用: 了解反射在框架和库中的典型应用场景
  4. 性能考虑: 理解反射的性能开销和优化策略
  5. 安全使用: 掌握反射的最佳实践和常见陷阱

正在精进