gpt4 book ai didi

go - 创建未知类型的 slice ?

转载 作者:IT王子 更新时间:2023-10-29 00:40:37 26 4
gpt4 key购买 nike

我正在尝试使用此函数(来自 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com