1

假设我有一个返回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变量只是为了找到长度的蛮力方式。

4

1 回答 1

5

Len在您当前尝试使用 refect 包时,您正在查询Type. 因此,这假设您正在处理数组而不是slice。不同之处在于数组是固定大小的切片,切片具有无限长度。

检查此代码以进行演示

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())
}
于 2018-08-27T18:31:16.947 回答