go中 反射获取结构体变量值,组装cmd命令的小例子
// GocFlag is flag of profile APItype GocFlag struct {RootGocCmdGocCmdNamestring`form:"name" json:"name"`Centerstring`form:"center" json:"center"`Forcebool`form:"force" json:"force"`Servi
·
// GocFlag is flag of profile API
type GocFlag struct {
RootGocCmd GocCmd
Name string `form:"name" json:"name"`
Center string `form:"center" json:"center"`
Force bool `form:"force" json:"force"`
Service []string `form:"service" json:"service"`
Address []string `form:"address" json:"address"`
CoverFilePatterns []string `form:"coverfile" json:"coverfile"`
SkipFilePatterns []string `form:"skipfile" json:"skipfile"`
OutPut string `form:"output" json:"output"`
//v2
GocHost string `form:"host" json:"host"`
Id string `form:"id" json:"id"`
}
//...自定义方法实现Cmd接口
type Cmd interface {
flag() (string, error)
getRootCmd() GocCmd
SetRootCmd(GocCmd)
Run() ([]byte, error)
Result(dst interface{}, src []byte) error
}
// 以json作为flag变量值
func BuildFlag(cmd Cmd) (string, error) {
var buildflag string
structValue := reflect.ValueOf(cmd).Elem()
structType := reflect.TypeOf(cmd)
if structType.Kind() == reflect.Ptr {
structType = structType.Elem()
}
for i := 0; i < structType.NumField(); i++ {
field := structType.Field(i)
if field.Tag.Get("json") == "" {
continue
}
switch fieldValue := structValue.FieldByName(field.Name).Interface().(type) {
case bool:
if fieldValue {
buildflag += "--" + field.Tag.Get("json")
}
case string:
if fieldValue != "" {
buildflag += "--" + field.Tag.Get("json") + "=" + fieldValue
}
case []string:
if len(fieldValue) == 0 {
continue
}
buildflag += "--" + field.Tag.Get("json") + "=" + strings.Join(fieldValue, ",")
case int:
if fieldValue != 0 {
fieldValueStr := strconv.Itoa(fieldValue)
buildflag += "--" + field.Tag.Get("json") + "=" + fieldValueStr
}
}
buildflag += " "
}
return buildflag, nil
}```
更多推荐
所有评论(0)