Как сделать массив элементов с типом, указанным во время выполнения - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь создать массив элементов с типом, известным только во время выполнения (pkg API получает для извлечения элементов в json и преобразования в struct).У меня есть вспомогательная функция, как показано ниже, которая принимает интерфейс в качестве параметра и пытается получить тип интерфейса во время вызова make.

Компилятору Голанга это не нравится.

var whatAmI = func(i interface{}) { 
        a := reflect.TypeOf(i)

        //var typ reflect.Type = a

        b := make (a, 10)    //10 elem with type of i

        //b := new (typ)
        fmt.Printf ("a: %v b: %v", a, b)
}

prog.go: 21: 14: a не является типом

Я пробовал различные комбинации отражений, но пока не помог.Мне кажется, это обычная проблема, с которой можно столкнуться.Как я могу решить / обойти это?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Получить тип для среза с учетом значения типа элемента, v:

sliceType := reflect.SliceOf(reflect.TypeOf(v))

Создать срез с длиной и емкостью (здесь 10).

slice:= reflect.MakeSlice(sliceType, 10, 10)

В зависимости от того, что вы делаете, вы можете получить фактическое значение среза, вызвав Interface () для отражателя. Значение:

s := slice.Interface()

Запустите его на игровой площадке .

0 голосов
/ 19 сентября 2018

Просто сделай как:

b := make([]interface{}, 10)
for i := range b {
    b[i] = reflect.Zero(a)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...