如何使用结构体上的反射作为指针?
如果 JSON 解组失败,我想检查 JSON 输入是否有任何未知字段或任何字段是否有无效值类型
第一步是从模型结构中获取所有字段并将它们添加到映射中。在这里我遇到了一些问题
input := dbw.Block{}
get_struct_map(&input)
func get_struct_map(input any) map[string]string {
list := map[string]string
fmt.Printf("Type: %T\n", input)
struct_type := reflect.TypeOf(input)
if struct_type.Kind() != reflect.Struct {
fmt.Println(struct_type.Kind())
}
struct_val := reflect.ValueOf(input)
field_num := struct_val.NumField()
for i := 0; i < field_num; i++ {
field := struct_val.Field(i)
fmt.Println(field)
list[field] = // value should be the type of the field
}
return list
}
这是结构。有些字段是指针(不是全部)
package dbw
type Block struct {
Id *int `json:"id"`
Name *string `json:"name"`
Email *string `json:"email"`
Vat string `json:"vat"`
}
输出
Type: *dbw.Block
ptr
2024/09/04 09:48:07.673861 /var/www/pkg/api/api.go:67: *errors.errorString Input should be a struct
错误发生在这一行
field_num := struct_val.NumField()
错误来自
panic("Input should be a struct")
行。您将指向 dbw.Block
结构体的指针传递给 get_struct_map
函数,这使得条件 struct_type.Kind() != reflect.Struct
为真,因此会出现恐慌。
您还应该注意命名约定。