2013-10-15 6 views
6

używam odzwierciedlać pakiet aby dostać typ arbitralnej tablicy, ale corazGolang: uzyskać rodzaj wycinka

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

Jak uzyskać typ z tablicy? Wiem, jak zdobyć to z wartości.

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

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

Odpowiedz

4

Zmiana:

GetTypeArray(arr []interface{}) 

do:

GetTypeArray(arr interface{}) 

Nawiasem mówiąc, []int nie jest tablicą, ale plaster liczb całkowitych.

+3

To nie rozwiązuje problemu potencjalnej paniki poza granicami świata. Zobacz moją odpowiedź. – Mike

+0

@Mike Mimo że masz rację, nie jest to pytanie (które zawiera bardzo konkretny błąd do rozwiązania) i dlatego jest poza zakresem. – thwd

+2

Tytuł pytania to "Golang, Go: pobierz typ tablicy", i tego właśnie szukałem, kiedy go znalazłem. Nie sugeruję, że to twój błąd lub że go przegapiłeś. Jednak ważne jest, aby go rozwiązać, ponieważ prawie użyłem tego kodu bez zauważenia błędu lub faktu, że rozwiązanie było nieoptymalne. Nie próbuję cię wyzwać, po prostu uważam, że to ważne. – Mike

18

Fakt, że indeksujesz plaster jest niebezpieczny - jeśli jest pusty, dostaniesz panikę uruchomioną z indeksem poza zasięgiem. Niezależnie od tego, że to zbędne ze względu na 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 

    ... 
} 

Więc oto co chcesz używać:

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

zauważyć, że zgodnie użytkownika @ tomwilde zmiany, argument arr może być absolutnie każdy rodzaj , więc nic nie stoi na przeszkodzie, aby przed przekazaniem GetTypeArray() uzyskać wartość nieprzyłączoną w czasie wykonywania i uzyskać panikę.