通八洲科技

如何在Golang中实现通用打印函数_遍历任意对象字段值

日期:2025-12-27 00:00 / 作者:P粉602998670
PrintFields函数使用reflect包遍历并打印结构体导出字段名与值:先解引用指针,验证为结构体后,循环NumField()获取字段名和Interface()值。

在 Go 中实现通用打印函数来遍历任意对象的字段值,核心是使用 reflect 包。Go 没有泛型反射(直到 Go 1.18+ 泛型配合反射仍需手动处理结构体),但通过 reflect.Valuereflect.Type 可安全、递归地访问导出字段(首字母大写)的名称与值。

只打印导出字段(推荐基础版)

Go 的反射无法读取未导出字段(小写开头),这是语言设计的安全限制。以下函数仅遍历并打印结构体中可访问的字段名和值:

示例代码:

func PrintFields(v interface{}) {
    val := reflect.ValueOf(v)
    if val.Kind() == reflect.Ptr {
        val = val.Elem()
    }
    if val.Kind() != reflect.Struct {
        fmt.Printf("not a struct: %v\n", v)
        return
    }

    typ := reflect.TypeOf(v)
    if typ.Kind() == reflect.Ptr {
        typ = typ.Elem()
    }

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

支持嵌套结构体与基础类型递归展开

若想深入打印嵌套结构体、map、slice 等复合类型,需递归处理。注意控制深度防止无限循环(如循环引用),并区分基础类型与容器类型:

可封装为 PrintDeep(v interface{}, indent string),初始调用传 ""

使用 JSON 或第三方库快速替代方案

如果目标只是“可读地查看字段”,不必手写反射:

注意事项与避坑点

反射易出错,实际使用需留意: