我正在尝试使用此函数(来自 go-couchbase)获取多个值。
func (b *Bucket) Gets(k string, rv interface{}, caso *uint64) error {
data, _, cas, err := b.GetsRaw(k)
if err != nil {
return err
}
if caso != nil {
*caso = cas
}
return json.Unmarshal(data, rv)
}
问题是我不知道如何创建 rv 的 slice ,因为我不知道它在我的函数中的类型,我也不知道它有多大,所以我无法真正访问rv
对索引进行 slice ,对吗?
我想尽可能通用,所以为每个 rv
结构创建一个函数并不是真正的最佳选择,GetBulk函数只返回一个[]byte
。
是否有可能在 go 中做我想做的事?
最佳答案
您可以使用 reflect
包检查类型信息。如果我们有一个函数,它有一个参数 rv interface{}
,我们希望在其中传入一个指向 slice 的指针,我们可以创建一个 reflect.Value
来引用那片:
slice := reflect.ValueOf(rv).Elem()
我们可以按如下方式重新初始化 slice :
slice.Set(reflect.MakeSlice(slice.Type(), length, capacity))
我们可以通过以下方式确定此 slice 的元素类型:
elemType := slice.Type().Elem()
然后创建另一个 reflect.Value
表示指向该类型的新分配实例的指针:
v := reflect.New(elemType)
现在 v.Interface()
适合传递给 json.Unmarshal
这样的函数。一旦它被填充,它就可以附加到 slice 中:
slice.Set(reflect.Append(slice, v.Elem()))
有关将 JSON 文档 slice 解码为任意 slice 类型的完整示例,请参阅 http://play.golang.org/p/G-SHQO2MAT
关于go - 创建未知类型的 slice ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24777603/