面试题答案
一键面试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
函数中,给出了一些调用示例展示如何使用这个函数。