Как определить тип значений в срезе интерфейса {} - PullRequest
0 голосов
/ 13 марта 2020

Рассмотрим следующий код:

package main

import (
    "fmt"
    "reflect"
)

func f(v interface{}) {
    fmt.Println(reflect.TypeOf(v).Elem())
    fmt.Println(reflect.ValueOf(v))
}
func main() {
    var aux []interface{}
    aux = make([]interface{}, 2)
    aux[0] = "foo"
    aux[1] = "bar"
    f(aux)
}

Вывод:

interface {}
[foo bar]

Как определить тип элементов, которые содержатся во фрагменте интерфейса {}, в этом конкретном примере мне нужно знать в своей функции f, что этот фрагмент интерфейса {} содержит string значений.

В моем случае использования отражения я пытаюсь установить поле структуры в зависимости о типе значений, в котором хранится мой параметр интерфейса {}.

1 Ответ

1 голос
/ 13 марта 2020

Значение, которое вы передаете, имеет тип []interface{}, поэтому тип элемента будет interface{}. Если вы хотите посмотреть, что это за типы элементов, вам нужно поразмышлять о них по отдельности:

func f(i interface{}) {
    v := reflect.ValueOf(i)
    for i := 0; i < v.Len(); i++ {
        e := v.Index(i)
        fmt.Println(e.Elem().Type())
        fmt.Println(e)
    }
}

Если вы знаете, что у вас всегда будет []interface{}, используйте его в качестве типа аргумента для выполнения итерации и проверка типа проще:

func f(things []interface{}) {
    for _, thing := range things {
        v := reflect.ValueOf(thing)
        fmt.Println(v.Type())
        fmt.Println(v)
    }
}
...