package codec import ( "fmt" "strings" ) const ( // tagName 结构体tag名称 // 格式参考 https://pkg.go.dev/encoding/json/v2#example-package-FormatFlags tagName = "req" inOptName = "in" queryOptName = "query" pathOptName = "path" formOptName = "form" headerOptName = "header" ) // Tag is a struct tag type Tag struct { Name string // tag name In string // query/path参数中 Option map[string]string // 自定义参数 } func parseTag(tagStr string) (*Tag, error) { tagStr = strings.TrimSpace(tagStr) if tagStr == "" { return nil, fmt.Errorf("tag is empty") } parts := strings.Split(tagStr, ",") name := strings.TrimSpace(parts[0]) t := &Tag{ Name: name, Option: map[string]string{}, } for _, part := range parts[1:] { part = strings.TrimSpace(part) if part == "" { return nil, fmt.Errorf("tag option not valid") } opt := strings.SplitN(part, ":", 2) key := opt[0] val := "" if len(opt) == 2 { val = opt[1] } if key == inOptName { t.In = val } else { t.Option[key] = val } } return t, nil }