go - 获取未知类型 slice 的长度

标签 go slice go-reflect

假设我有一个返回接口(interface){}的函数。但我知道项目返回是某种类型的一部分。我如何确定该 slice 的长度?这是我尝试过的示例代码,但它们都会导致编译错误。

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 包时,您正在查询 TypeLen。因此,这假设您正在处理一个数组,而不是一个 slice 。不同之处在于数组是固定大小的 slice , 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())
}

关于go - 获取未知类型 slice 的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52044982/

相关文章:

javascript - JS String 的长度为 n,但只有 n-1 个字符。使用 str = str.slice(0,-1)

go - 在 Go 中,如何使用反射在结构上设置映射的值?

go - 实例新类型(Golang)

go - 如何重置或丢弃缓冲数据

Rust 中类似 Golang 的延迟

go - 如何使用 go 客户端在 kubernetes 服务上观看事件

golang 在 cmd.Start 启动的进程中处理 kill

python - Pandas 如何切片多索引数据帧?

go - big.Int slice 在append() 上重写自身

go - 使用反射获取函数名称