创建未知类型的切片?

Fil*_*und 5 go couchbase

我正在尝试使用此功能(从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

甚至有可能做我想做的事?

Jam*_*dge 5

您可以使用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