Go语言如何处理元素结构相同的动态键嵌套结构体
解决方案
核心思路是用map类型承接payloads数组元素里的动态键(xss、tpli这类自定义类型名),不需要硬编码结构体字段,后续新增payload类型仅需修改JSON配置,无需调整Go代码。
结构体定义
// PayloadItem 单条payload的固定结构 type PayloadItem struct { Payload string `json:"payload"` Search string `json:"search"` } // PayloadRoot JSON最外层结构 type PayloadRoot struct { Payloads []map[string][]PayloadItem `json:"payloads"` }
解析&使用示例
package main import ( "encoding/json" "fmt" ) type PayloadItem struct { Payload string `json:"payload"` Search string `json:"search"` } type PayloadRoot struct { Payloads []map[string][]PayloadItem `json:"payloads"` } func main() { // jsonStr替换为你的实际JSON配置内容 jsonStr := `你的JSON配置字符串` var root PayloadRoot err := json.Unmarshal([]byte(jsonStr), &root) if err != nil { panic(err) } // 遍历所有payload的示例 for _, group := range root.Payloads { // group的key就是payload类型(xss/tpli/后续新增的其他类型) for payloadType, items := range group { fmt.Printf("=== %s 类型payload ===\n", payloadType) for i, item := range items { fmt.Printf("%d. payload: %s, search: %s\n", i+1, item.Payload, item.Search) } } } }
方案说明
- 所有动态键全部由
map[string][]PayloadItem承接,不需要提前在结构体中定义xss、tpli这类字段 - 后续新增如
sqli、命令注入等其他类型的payload时,仅需要在JSON配置里添加对应键值对即可,Go代码不需要任何修改 - 类型安全,不需要额外做类型断言,所有payload的结构都有明确的结构体约束
内容的提问来源于stack exchange,提问作者DarkMantis
相关产品推荐
相关产品推荐

