使用结构体上的反射作为指针,并使用某些字段作为指针

问题描述 投票:0回答:1

如何使用结构体上的反射作为指针?

如果 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()

json go reflection
1个回答
0
投票

错误来自

panic("Input should be a struct")
行。您将指向
dbw.Block
结构体的指针传递给
get_struct_map
函数,这使得条件
struct_type.Kind() != reflect.Struct
为真,因此会出现恐慌。

您还应该注意命名约定。

© www.soinside.com 2019 - 2024. All rights reserved.