面试题答案
一键面试优点
- 灵活性:传统类型断言需要在编译时明确知道具体类型,而反射可以在运行时动态处理不同类型的数据。例如在编写通用的序列化或反序列化库时,反射允许处理各种未知类型的数据结构,而类型断言无法做到。
- 通用性:反射可以编写高度通用的代码,适用于多种类型。比如实现一个通用的对象比较函数,使用反射可以处理不同结构体类型的比较,而类型断言只能针对特定类型。
- 扩展性:对于新加入的类型,反射代码不需要修改,只需要在运行时处理即可。而类型断言方式则需要在代码中添加新的类型断言分支来处理新类型。
示例
package main
import (
"fmt"
"reflect"
)
func printValue(v interface{}) {
value := reflect.ValueOf(v)
switch value.Kind() {
case reflect.Int:
fmt.Printf("Int: %d\n", value.Int())
case reflect.String:
fmt.Printf("String: %s\n", value.String())
case reflect.Struct:
fmt.Println("Struct:")
for i := 0; i < value.NumField(); i++ {
fmt.Printf(" Field %d: %v\n", i, value.Field(i))
}
default:
fmt.Printf("Unsupported type: %v\n", value.Kind())
}
}
func main() {
var num int = 10
var str string = "Hello"
type Person struct {
Name string
Age int
}
p := Person{Name: "John", Age: 30}
printValue(num)
printValue(str)
printValue(p)
}
在上述示例中,printValue
函数通过反射动态处理了 int
、string
和自定义结构体 Person
类型的数据,展示了反射在处理不同类型数据时的通用性。