您的位置:首页 >Go反射遍历结构体字段及值检查
发布于2026-04-13 阅读(0)
扫一扫,手机访问

本文介绍如何在Go中像JavaScript那样遍历结构体的所有字段,通过反射机制动态获取字段名和值,实现批量校验或处理逻辑。
本文介绍如何在Go中像JavaScript那样遍历结构体的所有字段,通过反射机制动态获取字段名和值,实现批量校验或处理逻辑。
在Go语言中,结构体(struct)是静态类型,编译期即确定字段布局,因此不支持原生的 for...in 式动态遍历——这与JavaScript等动态语言有本质区别。但借助标准库的 reflect 包,我们完全可以实现类似语义:遍历结构体所有导出字段(即首字母大写的字段),读取其名称、标签(如 json、bson)及当前值,并执行统一逻辑(如非空校验、日志打印、序列化预处理等)。
以下是一个完整、安全、可复用的示例:
package main
import (
"fmt"
"reflect"
)
type DisplayObject struct {
ID string `json:"id,omitempty" bson:"id"`
URI string `json:"uri,omitempty" bson:"uri"`
Display string `json:"display,omitempty" bson:"display"`
}
// CheckAllFields checks each exported field and executes custom logic
func CheckAllFields(obj interface{}) {
v := reflect.ValueOf(obj)
if v.Kind() == reflect.Ptr {
v = v.Elem() // 解引用指针
}
if v.Kind() != reflect.Struct {
panic("CheckAllFields: input must be a struct or *struct")
}
t := v.Type()
for i := 0; i < v.NumField(); i++ {
field := t.Field(i)
value := v.Field(i)
// 仅处理导出字段(Go反射无法访问未导出字段)
if !value.CanInterface() {
continue
}
fieldName := field.Name
fieldValue := value.Interface()
// 示例逻辑:检查字符串字段是否非空
if str, ok := fieldValue.(string); ok && str != "" {
fmt.Printf("✅ Field %q = %q (non-empty)\n", fieldName, str)
// ✅ 此处可插入业务逻辑:如记录、转换、验证等
} else {
fmt.Printf("⚠️ Field %q is empty or not a string\n", fieldName)
}
}
}
func main() {
obj := &DisplayObject{
ID: "123",
URI: "https://example.com",
Display: "", // 留空用于演示
}
CheckAllFields(obj)
}运行输出:
✅ Field "ID" = "123" (non-empty) ✅ Field "URI" = "https://example.com" (non-empty) ⚠️ Field "Display" is empty or not a string
? 关键注意事项:
综上,Go虽无语法糖式的“对象遍历”,但 reflect 提供了强大而可控的元编程能力——合理使用它,你就能写出兼具灵活性与健壮性的通用工具函数。
上一篇:徐晃角色玩法与强度解析
下一篇:Safari网站权限管理设置方法
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9