获取未知类型切片的长度
Get the length of a slice of unknown type
假设我有一个 returns 和 interface{}
的函数。但我知道项目 returns 是某种切片。我如何确定该切片的长度?这是我尝试过的示例代码,但它们都会导致编译错误。
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
变量来查找长度的蛮力方式。
在您当前尝试使用 refect 包时,您正在查询 Type
的 Len
。因此,这假设您正在处理 array 而不是 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())
}
假设我有一个 returns 和 interface{}
的函数。但我知道项目 returns 是某种切片。我如何确定该切片的长度?这是我尝试过的示例代码,但它们都会导致编译错误。
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
变量来查找长度的蛮力方式。
在您当前尝试使用 refect 包时,您正在查询 Type
的 Len
。因此,这假设您正在处理 array 而不是 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())
}