Функция Go принимает другой параметр массива - PullRequest
0 голосов
/ 08 мая 2019

Я хочу использовать универсальную функцию для демарширования различных типов:

type Foo struct {
  Name    string
  Another string
}

type Bar struct {
  Name  string
  Some  string
}

func unmarshal(data []byte, val *[]map[string]interface{}) {
  err := json.Unmarshal(data, val)

  if err != nil || (*val)[0]["Name"] == "" {
    *val = nil
  }
}

func main() {
  var foos []Foo
  var bars []Bar

  // fooData and barData are JSON strings retrieved from database
  unmarshal(fooData, &foos)
  unmarshal(barData, &bars)
}

Я получил сообщение об ошибке типа cannot use &foo (type *[]Foo) as type *[]map[string]interface {} in argument to unmarshal.

Я пытался использовать val interface{} в качестве параметрано он не поддерживает индекс.

Как мне тогда достичь цели?Благодаря.

1 Ответ

2 голосов
/ 08 мая 2019

Чтобы работать с произвольными типами срезов, объявите аргумент как тип interface{} и используйте отражение для доступа к значению:

func unmarshal(data []byte, v interface{}) {
    err := json.Unmarshal(data, v)
    rv := reflect.ValueOf(v).Elem()

    if err != nil || rv.Len() == 0 || rv.Index(0).FieldByName("Name").Interface() == "" {
        rv.Set(reflect.Zero(rv.Type()))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...