Reflection 如何设置struct字段抛出接口?

Reflection 如何设置struct字段抛出接口?,reflection,struct,go,Reflection,Struct,Go,各位! 我的任务是解析命令行参数并填充结构字段。我的函数必须能处理各种参数——它们将在struct标记中描述 例如: type CommndLineArguments struct { Configfile string `required:"false" name:"config" default:"/etc/daemon.conf" description:"Config file"` Daemon bool `required:"true" name:"daemon"

各位!

我的任务是解析命令行参数并填充结构字段。我的函数必须能处理各种参数——它们将在struct标记中描述

例如:

type CommndLineArguments struct {
   Configfile string `required:"false" name:"config" default:"/etc/daemon.conf" description:"Config file"`
   Daemon     bool `required:"true" name:"daemon" default:"false" description:"Run as daemon"`
}
我使用reflect和flag包。像这样:

func    GetArguments(variable interface{}) error {
//Check is this a pointer to struct
variableType := reflect.TypeOf(variable)
if variableType.Kind() != reflect.Ptr {
    return errors.New(ERR_PASS_BY_VALUE)
} else if variableValue := variableType.Elem(); variableValue.Kind() != reflect.Struct {
    return errors.New(ERR_NOT_A_STRUCT)
}

// Parse parameters

variableValue := variableType.Elem()

for i := 0; i < variableValue.NumField(); i++ {
    structField := variableValue.Field(i)
    fieldName := structField.Name
    fieldType := structField.Type
    fieldTag := structField.Tag
但最后一行有个错误

./parser.go:42:无法将&structField类型*reflect.structField用作函数参数中的类型*bool


我的问题是如何正确设置此字段?

您必须获得该字段的地址,并使用ValueOf not TypeOf:


简单演示@

您考虑过使用吗?它允许您根据结构和结构标记定义标志。请使用go fmt格式化您的代码,或者,它使我们更容易遵循代码。@elithrar+1,我使用的是go标志,它是awesome@elithrar这是一个有趣的包,但我不知道我的结构将包含哪些字段。@DmitriyDemidov你不知道是什么意思?go flags公开与您想要公开的API完全相同的API,它已经按照您想要的方式工作了。除非你是出于教育目的,否则没有理由写同样的东西。记住,你应该检查字段是否已经是指针。
switch fieldType.Kind() {
    case reflect.Bool:
        defaultValue, err := strconv.ParseBool(fieldTag.Get("default"))
        if err != nil {
            return errors.New(ERR_PARSE_ERROR + err.Error())
        }
        flag.BoolVar(&structField, fieldName, defaultValue, fieldTag.Get("description"))
flag.BoolVar(fld.Addr().Interface().(*bool), fieldName, defaultValue, fieldTag.Get("description"))