package main
import (
"fmt"
"reflect"
)
func recursiveProcess(args...interface{}) string {
var result string
for _, arg := range args {
value := reflect.ValueOf(arg)
switch value.Kind() {
case reflect.Slice:
// 处理切片
for i := 0; i < value.Len(); i++ {
result += recursiveProcess(value.Index(i).Interface())
}
default:
// 其他类型直接转字符串拼接
result += fmt.Sprintf("%v", arg)
}
}
return result
}
代码逻辑解释
- 函数定义:
recursiveProcess
函数接受不定数量的参数 args...interface{}
,这意味着可以传入任意数量、任意类型的参数。
- 初始化结果字符串:定义一个变量
result
用于存储最终拼接的字符串。
- 遍历参数:通过
for
循环遍历传入的每个参数 arg
。
- 反射获取值:使用
reflect.ValueOf(arg)
获取参数的反射值 value
,这样可以进一步判断其类型和进行操作。
- 类型判断与处理:
- 切片类型:当
value.Kind()
为 reflect.Slice
时,通过 for
循环遍历切片的每个元素,对每个元素递归调用 recursiveProcess
函数,将结果拼接到 result
中。
- 其他类型:对于非切片类型,直接使用
fmt.Sprintf("%v", arg)
将其转换为字符串并拼接到 result
中。
- 返回结果:最终返回拼接好的字符串
result
。
反射在该场景下的关键操作
- 获取反射值:
reflect.ValueOf(arg)
用于获取参数的反射值,这是反射操作的入口。通过反射值可以获取参数的类型、值等信息。
- 判断类型:
value.Kind()
用于判断反射值的具体类型,这里通过判断是否为 reflect.Slice
来决定是否递归处理切片元素。
- 访问切片元素:对于切片类型,使用
value.Index(i)
获取切片中指定索引位置的元素,并通过 .Interface()
方法将其转换回接口类型,以便递归调用 recursiveProcess
函数进行处理。