2013-10-15 2 views
6

я использую отражают пакет, чтобы получить тип произвольного массива, но получитьGolang: получить тип среза

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

ответ

4

Изменение:

GetTypeArray(arr []interface{}) 

к:

GetTypeArray(arr interface{}) 

Кстати, []int не является массивом, но кусочек целых чисел.

+3

Это не решает проблему потенциальной паники индекса. См. Мой ответ. – Mike

+0

@Mike Несмотря на то, что вы правы, это не вопрос (который включает в себя очень специфическую ошибку для решения), и, следовательно, он выходит из сферы действия здесь. – thwd

+2

Название вопроса: «Golang, Go: получите тип массива», и именно этого я и искал, когда нашел его. Я не предполагаю, что это ваша ошибка или что вы ее пропустили. Однако важно, чтобы это было рассмотрено, потому что я почти использовал этот код, не заметив ошибку или тот факт, что решение было субоптимальным. Я не пытаюсь бросить вам вызов, я просто думаю, что это важно. – Mike

18

Тот факт, что вы индексируете срез, небезопасен - если он пуст, вы получите панику в режиме ожидания вне диапазона. Независимо от того, это лишнее из-за reflect package's Elem() method:

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() нерезкое значение во время выполнения и получить панику.

Смежные вопросы