go中 反射获取结构体变量值,组装cmd命令的小例子

// 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值