MST

星途 面试题库

面试题:Go不定参数在递归与反射场景下的深度应用

编写一个递归函数,该函数接受不定数量的参数,参数类型可以是任意的。在递归过程中,使用反射来判断参数类型,如果是切片类型,则递归处理切片中的元素。函数最终要能将所有处理过的元素以合适的形式返回(例如拼接成字符串等)。请详细解释代码逻辑及反射在该场景下的关键操作。
27.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
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
}

代码逻辑解释

  1. 函数定义recursiveProcess 函数接受不定数量的参数 args...interface{},这意味着可以传入任意数量、任意类型的参数。
  2. 初始化结果字符串:定义一个变量 result 用于存储最终拼接的字符串。
  3. 遍历参数:通过 for 循环遍历传入的每个参数 arg
  4. 反射获取值:使用 reflect.ValueOf(arg) 获取参数的反射值 value,这样可以进一步判断其类型和进行操作。
  5. 类型判断与处理
    • 切片类型:当 value.Kind()reflect.Slice 时,通过 for 循环遍历切片的每个元素,对每个元素递归调用 recursiveProcess 函数,将结果拼接到 result 中。
    • 其他类型:对于非切片类型,直接使用 fmt.Sprintf("%v", arg) 将其转换为字符串并拼接到 result 中。
  6. 返回结果:最终返回拼接好的字符串 result

反射在该场景下的关键操作

  1. 获取反射值reflect.ValueOf(arg) 用于获取参数的反射值,这是反射操作的入口。通过反射值可以获取参数的类型、值等信息。
  2. 判断类型value.Kind() 用于判断反射值的具体类型,这里通过判断是否为 reflect.Slice 来决定是否递归处理切片元素。
  3. 访问切片元素:对于切片类型,使用 value.Index(i) 获取切片中指定索引位置的元素,并通过 .Interface() 方法将其转换回接口类型,以便递归调用 recursiveProcess 函数进行处理。