package main

import (
	"fmt"
	"reflect"
)

// 定义一个示例结构体
type ExampleStruct struct {
	Name   string
	Age    int
	Active bool
}

// TraverseStruct 函数接收一个任意的结构体，并遍历其所有字段及对应的值
func TraverseStruct(s interface{}) {
	val := reflect.ValueOf(s)
	if val.Kind() == reflect.Ptr {
		val = val.Elem() // 处理指针到结构体的转换
	}

	// 确保传入的是结构体
	if val.Kind() != reflect.Struct {
		fmt.Println("provided value is not a struct")
		return
	}

	typ := val.Type()
	for i := 0; i < val.NumField(); i++ {
		field := typ.Field(i)
		value := val.Field(i)
		fmt.Printf("%s (type %s): %v\n", field.Name, field.Type, value)
	}
}

func main() {
	// 创建一个结构体实例
	example := ExampleStruct{
		Name:   "John Doe",
		Age:    30,
		Active: true,
	}

	// 调用函数，传入结构体指针
	TraverseStruct(&example)
}
