Dado o cenário em que você tem uma função que aceita t interface{}
. Se for determinado que t
é uma fatia, como faço para range
sobre essa fatia?
func main() {
data := []string{"one","two","three"}
test(data)
moredata := []int{1,2,3}
test(data)
}
func test(t interface{}) {
switch reflect.TypeOf(t).Kind() {
case reflect.Slice:
// how do I iterate here?
for _,value := range t {
fmt.Println(value)
}
}
}
Exemplo de Go Playground: http://play.golang.org/p/DNldAlNShB
go
reflection
slice
go-reflect
Nucleon
fonte
fonte
Respostas:
Bem, eu usei
reflect.ValueOf
e então se for uma fatia você pode chamarLen()
eIndex()
no valor para obter olen
da fatia e do elemento em um índice. Não acho que você será capaz de usar a operação de alcance para fazer isso.Exemplo de Go Playground: http://play.golang.org/p/gQhCTiwPAq
fonte
s.Index(i)
retorna um,reflect.Value
portanto, no meu caso, eu precisavas.Index(i).Interface()
fazer referência ao valor real.interface{}
? por exemplomoredata := &[]int{1,2,3}
Elem()
para obter o valor subjacente. por exemploreflect.TypeOf(reflect.ValueOf(t).Elem().Interface()).Kind()
Você não precisa usar reflexão se souber quais tipos esperar. Você pode usar uma chave de tipo , como esta:
Verifique o código no playground .
fonte
array[:]
.há uma exceção na maneira como a interface {} se comporta, @Jeremy Wall já deu um ponteiro. se os dados transmitidos forem definidos como [] interface {} inicialmente.
resultado:
Experimente
fonte