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

时间:2014-07-10 11:33:07

标签: reflection struct go

大家好!

我的任务是解析命令行参数并填充struct字段。我的函数必须适用于所有类型的参数 - 它们将在struct tag中进行描述。

例如:

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

我使用reflectflag个包。像这样:

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

现在我已经准备好解析参数了。

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"))

但我在最后一行收到错误。

./parser.go:42: cannot use &structField (type *reflect.StructField) as type *bool in function argument

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

1 个答案:

答案 0 :(得分:0)

您必须获取该字段的地址(也使用ValueOf而不是TypeOf):

flag.BoolVar(fld.Addr().Interface().(*bool), fieldName, defaultValue, fieldTag.Get("description"))

简单演示@ http://play.golang.org/p/yEG-OH6d4W