Получить длину среза неизвестного типа - PullRequest
0 голосов
/ 27 августа 2018

Допустим, у меня есть функция, которая возвращает interface{}. Но я знаю, что возврат товара - это какой-то кусок. Как я могу определить длину этого среза? Вот пример кода того, что я пробовал, но все они вызывают ошибку компиляции.

package main

import (
  "log"
  "reflect"
)
func SomeKindOfSlice() interface{} {
  return []int64{0,1,2,3,4,5,6,7,8,9}
}
func main() {
  slice := SomeKindOfSlice()
  /*log.Println(reflect.TypeOf(slice).Len())
  log.Println(reflect.TypeOf(slice).Type().Len())
  log.Println(reflect.ValueOf(slice).Type().Len())
  log.Println(reflect.ValueOf(slice).Elem().Type().Len())
  */
  log.Println(reflect.ValueOf(slice).Elem().Type().Len())
}

Я бы хотел избежать использования метода грубой силы для конкретного типа, утверждая переменную slice, просто чтобы найти длину.

1 Ответ

0 голосов
/ 27 августа 2018

В вашей текущей попытке использования пакета refect вы запрашиваете Len из Type. Таким образом, предполагается, что вы имеете дело с массивом , а не с срезом . Разница в том, что массив представляет собой срез фиксированного размера, срез имеет несвязанную длину.

Проверьте этот код для демонстрации

package main

import (
  "log"
  "reflect"
)
func SomeKindOfSlice() interface{} {
  return []int64{0,1,2,3,4,5,6,7,8,9}
}
func SomeKindOfArray() interface{} {
  return [10]int64{0,1,2,3,4,5,6,7,8,9}
}
func main() {
  log.Println(reflect.ValueOf(SomeKindOfSlice()).Len())
  log.Println(reflect.ValueOf(SomeKindOfArray()).Type().Len())
}
...