Golang: получить тип среза

Я использую пакет reflect для получения типа произвольного массива, но получаю

   prog.go:17: cannot use sample_array1 (type []int) as type []interface {} in function argument [process exited with non-zero status]

Как получить тип из массива? Я знаю, как получить его значение.

  func GetTypeArray(arr []interface{}) reflect.Type {
      return reflect.TypeOf(arr[0])
  }

http://play.golang.org/p/sNw8aL0a5f

2 ответов


изменения:

GetTypeArray(arr []interface{})

в:

GetTypeArray(arr interface{})

кстати, []int - это не массив, а slice целых чисел.


тот факт, что вы индексируете срез, небезопасен - если он пуст, вы получите панику во время выполнения индекса вне диапазона. Несмотря на это, это не нужно из-за отразить пакета Elem() метод:

type Type interface {

    ...

    // Elem returns a type's element type.
    // It panics if the type's Kind is not Array, Chan, Map, Ptr, or Slice.
    Elem() Type

    ...
}

Итак, вот что вы хотите использовать:

func GetTypeArray(arr interface{}) reflect.Type {
      return reflect.TypeOf(arr).Elem()
}

обратите внимание, что в соответствии с изменением @tomwilde, аргумент arr может быть абсолютно любого типа, так что ничто не мешает вам пройти GetTypeArray() значение без среза во время выполнения и получение паника.