// 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
}```

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐