samedi 21 octobre 2017

How do I append to a slice field in a struct using reflection?

I have a struct that looks like this:

type guitaristT struct {
    Surname  string   `required=true`
    Year     int64    `required=false`
    American bool     // example of missing tag
    Rating   float32  `required=true`
    Styles   []string `required=true,minsize=1`
}

I have an environment variable that looks like the following, and I'm using reflection to fill the struct based on the keys.

jimiEnvvar :="surname=Hendrix|year=1942|american=true|rating=9.99
  |styles=blues|styles=rock|styles=psychedelic"

I'm able to set the string, int64, bool and float32 fields using reflection, but I'm stuck on how to append to the slice field Styles. For example, based on the above jimiEnvvar I would like the field jimi.Styles to have the values ["blues","rock", "psychedelic"].

I have the following (simplified) code:

result := guitaristT{}
result.Styles = make([]string, 10)
...
v := reflect.ValueOf(&result).Elem()
...
field := v.FieldByName(key) // eg key = "styles"
...
switch field.Kind() {

case reflect.Slice:
     // this is where I get stuck
     //
     // reflect.Append() has signature:
     //   func Append(s Value, x ...Value) Value

     // so I convert my value to a reflect.Value
     stringValue := reflect.ValueOf(value) // eg value = "blues"

     // but this doesn't append:
     field = reflect.Append(field, stringValue)


If you're interested, the full code is at http://ift.tt/2hUOEfA . It just some notes I'm writing for myself; crazy names I know :-)





Aucun commentaire:

Enregistrer un commentaire