MST
星途 面试题库

面试题:Go不定参数在反射机制下的深度应用

使用Go的反射机制,编写一个函数,该函数接受不定参数。如果参数是结构体,打印结构体的字段和值;如果是切片,打印切片的每个元素;如果是其他类型,打印类型信息。要求在函数内部灵活处理不定参数,并且能正确处理嵌套结构(如结构体中包含切片,切片中又包含结构体等情况)。
12.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "reflect"
)

func printValue(v interface{}) {
    value := reflect.ValueOf(v)

    switch value.Kind() {
    case reflect.Struct:
        for i := 0; i < value.NumField(); i++ {
            field := value.Field(i)
            fmt.Printf("%s: ", value.Type().Field(i).Name)
            printValue(field.Interface())
            fmt.Println()
        }
    case reflect.Slice:
        for i := 0; i < value.Len(); i++ {
            printValue(value.Index(i).Interface())
            fmt.Println()
        }
    default:
        fmt.Printf("%v (type: %T)\n", v, v)
    }
}

func handleArgs(args ...interface{}) {
    for _, arg := range args {
        printValue(arg)
        fmt.Println()
    }
}

你可以这样调用这个函数:

func main() {
    type InnerStruct struct {
        Name string
    }

    type OuterStruct struct {
        Inner InnerStruct
        Data  []int
    }

    inner := InnerStruct{Name: "inner"}
    outer := OuterStruct{Inner: inner, Data: []int{1, 2, 3}}
    slice := []InnerStruct{inner}

    handleArgs(outer, slice, "string value")
}

以上代码实现了一个handleArgs函数,该函数接受不定参数,并根据参数的类型,使用反射机制打印出结构体的字段和值、切片的每个元素或其他类型的类型信息。printValue函数是一个递归函数,用于处理嵌套结构。在main函数中,给出了一些调用示例展示如何使用这个函数。