我正在尝试使用此功能(从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)
}
Run Code Online (Sandbox Code Playgroud)
问题是我不知道如何创建rv的切片,因为我不知道它在函数中的类型,而且我也不知道它将有多大,因此我无法真正rv
通过索引访问该切片, 对?
我想尽可能地笼统,因此按rv
结构创建函数并不是真正理想的选择,而GetBulk函数仅返回a []byte
。
甚至有可能做我想做的事?
您可以使用reflect
包装检查类型信息。如果我们有一个带有参数的函数rv interface{}
,我们希望传递指向切片的指针,那么我们可以创建一个reflect.Value
引用该切片的:
slice := reflect.ValueOf(rv).Elem()
Run Code Online (Sandbox Code Playgroud)
我们可以重新初始化切片,如下所示:
slice.Set(reflect.MakeSlice(slice.Type(), length, capacity))
Run Code Online (Sandbox Code Playgroud)
我们可以使用以下方法确定此切片的元素类型:
elemType := slice.Type().Elem()
Run Code Online (Sandbox Code Playgroud)
然后创建另一个reflect.Value
代表该类型新分配实例的指针的指针:
v := reflect.New(elemType)
Run Code Online (Sandbox Code Playgroud)
现在v.Interface()
适合传递给的函数json.Unmarshal
。填充完毕后,可以将其追加到切片中:
slice.Set(reflect.Append(slice, v.Elem()))
Run Code Online (Sandbox Code Playgroud)
有关将JSON文档的片段解码为任意片段类型的完整示例,请参见http://play.golang.org/p/G-SHQO2MAT
归档时间: |
|
查看次数: |
1259 次 |
最近记录: |