go - 创建未知类型的 slice ?

标签 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)
}

问题是我不知道如何创建 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/

相关文章:

go - 由于持久连接,HAProxy 没有负载均衡

mongodb - 如何使用官方 MongoDB Go 驱动程序的 FindOne() 函数从 mongoDB 获取完整文档

docker - 在 docker swarm 环境中部署 couchbase

couchbase - 如何控制 Couchbase Java 客户端序列化日期的方式?

Couchbase 在开发人员之间共享 View (导入/导出功能)

go - 通过引用 fmt 传递参数

Go gin 响应中间件

go - 在 Go select 构造中,我可以在两个 case 语句中发送和接收到无缓冲 channel 吗?

java - Couchbase - 使用大写单词通过正则表达式查找文档

go - 沙发底座中的 “where not equal to”