代码实现
package main
import (
"fmt"
"reflect"
)
// 模拟加密函数
func encrypt(s string) string {
return "encrypted_" + s
}
// 模拟脱敏函数
func desensitize(s string) string {
return s[:2] + "***" + s[len(s)-2:]
}
func processStruct(i interface{}) {
valueOf := reflect.ValueOf(i)
if valueOf.Kind() != reflect.Ptr || valueOf.IsNil() {
panic("input must be a non - nil pointer to a struct")
}
valueOf = valueOf.Elem()
if valueOf.Kind() != reflect.Struct {
panic("input must be a non - nil pointer to a struct")
}
typeOf := valueOf.Type()
for i := 0; i < valueOf.NumField(); i++ {
field := valueOf.Field(i)
tag := typeOf.Field(i).Tag.Get("process")
switch tag {
case "encrypt":
if field.Kind() == reflect.String {
field.SetString(encrypt(field.String()))
}
case "desensitize":
if field.Kind() == reflect.String {
field.SetString(desensitize(field.String()))
}
}
fmt.Printf("%s: %v\n", typeOf.Field(i).Name, field.Interface())
}
}
type User struct {
Name string `process:"desensitize"`
Secret string `process:"encrypt"`
}
性能问题分析
- 运行时开销大:反射操作需要在运行时解析类型信息,相比于直接操作类型,这涉及更多的查找和判断,导致性能下降。
- 代码可读性和维护性降低:反射代码往往复杂且难以理解,容易引入错误,在大型项目中维护成本较高。
性能优化方案
- 缓存反射信息:对于经常处理的结构体类型,可以缓存其反射类型信息(如
reflect.Type
和reflect.Value
),避免每次都重新获取,从而减少运行时开销。
- 减少反射操作:尽量在初始化或编译期处理部分逻辑,避免在运行时频繁使用反射。例如,通过代码生成工具生成针对特定结构体的处理代码,而不是通用的反射代码。