go - interface{} 变量到 []interface{}

标签 go reflection interface slice type-assertion

我有一个 interface{} 变量,我知道它是一个指向 slice 的指针:

func isPointerToSlice(val interface{}) bool {
    value := reflect.ValueOf(val)
    return value.Kind() == reflect.Ptr && value.Elem().Kind() == reflect.Slice
}

但我发现很难将其类型转换为 []interface{} 变量:

if isPointerToSlice(val) {
  slice, worked := reflect.ValueOf(val).Elem().Interface().([]interface{})
  // 'worked' is false :(
}

这行不通。知道如何解决这个问题吗?

最佳答案

如果您只想将一个 slice 转换为 []interface{},您可以使用类似这样的东西:

func sliceToIfaceSlice(val interface{}) []interface{} {
    rf := reflect.Indirect(reflect.ValueOf(val)) // skip the pointer
    if k := rf.Kind(); k != reflect.Slice && k != reflect.Array {
        // panic("expected a slice or array")
        return nil
    }
    out := make([]interface{}, rf.Len())
    for i := range out {
        out[i] = rf.Index(i).Interface()
    }
    return out
}

playground

关于go - interface{} 变量到 []interface{},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35320357/

相关文章:

postgresql - 使用 Gorm 插入和选择 PostGIS 几何

pointers - 解码嵌套结构和类型断言

java - 有没有办法找到一个字段是否是与 isPrimitive() 相同的 boolean 值?

java - 通过接口(interface)实现多重继承

Java:类型参数必须实现接口(interface)

git - 构建并运行一个 go 项目的分支

go - 执行 os.Exit(1) 时如何禁用 "exit status 1"

java - 从同一类的另一个实例填充对象字段

c# - 为什么甚至可以更改私有(private)成员,或者使用反射在 C# 中运行私有(private)方法?

c# - 编辑接口(interface)时叫什么?