当前位置: 首页 > 面试题库 >

如果将数组作为&val传递,然后转换为接口{},则更新数组元素

仲鸿风
2023-03-14
问题内容

我正在尝试编写一些通用方法(CRUD方法)以在我的服务之间共享它。以下示例是一种GetAll()方法,该方法返回集合中存在的所有文档:

func GetAll(out interface{}) error {
    // mongodb operations

    // iterate through all documents
    for cursor.Next(ctx) {
        var item interface{}
        // decode the document
        if err := cursor.Decode(&item); err != nil {
            return err
        }
        (*out) = append((*out), item)
        // arrays.AppendToArray(out, item) // Read below :)
    }

    return nil // if no error

}

我也做了一些反思,但后来:

package arrays

import "reflect"

func AppendToArray(slicePtrInterface interface{}, item interface{}) {
    // enter `reflect`-land
    slicePtrValue := reflect.ValueOf(slicePtrInterface)
    // get the type
    slicePtrType := slicePtrValue.Type()
    // navigate from `*[]T` to `T`
    _ = slicePtrType.Elem().Elem() // crashes if input type not `*[]T`
    // we'll need this to Append() to
    sliceValue := reflect.Indirect(slicePtrValue)
    // append requested number of zeroes
    sliceValue.Set(reflect.Append(sliceValue, reflect.ValueOf(item)))
}

恐慌:reflect.Set:原始类型D的值不能分配给 mongodb.Test类型[已恢复]恐慌:reflect.Set:原始类型D的值不能分配给
mongodb.Test类型

我想要的是与cursor.Decode(&item)(您可以在上面看到的)相同的方法


问题答案:

方法如下:

// GetAll decodes the cursor c to slicep where slicep is a 
// pointer to a slice of pointers to values.
func GetAll(ctx context.Context, c *Cursor, slicep interface{}) error {
    // Get the slice. Call Elem() because arg is pointer to the slice.
    slicev := reflect.ValueOf(slicep).Elem()

    // Get value type. First call to Elem() gets slice 
    // element type. Second call to Elem() dereferences 
    // the pointer type.
    valuet := slicev.Type().Elem().Elem()

    // Iterate through the cursor...
    for c.Next(ctx) {
        // Create new value.
        valuep := reflect.New(valuet)

        // Decode to that value.
        if err := c.Decode(valuep.Interface()); err != nil {
            return err
        }

        // Append value pointer to slice.
        slicev.Set(reflect.Append(slicev, valuep))
    }
    return c.Err()
}

这样称呼它:

var data []*T
err := GetAll(ctx, c, &data)
if err != nil {
   // handle error
}

在Go Playground上运行它。

这是与非指针切片元素一起使用的代码的概括:

func GetAll(ctx context.Context, c *Cursor, slicep interface{}) error {
    slicev := reflect.ValueOf(slicep).Elem()
    valuet := slicev.Type().Elem()
    isPtr := valuet.Kind() == reflect.Ptr
    if isPtr {
        valuet = valuet.Elem()
    }
    for c.Next(ctx) {
        valuep := reflect.New(valuet)
        if err := c.Decode(valuep.Interface()); err != nil {
            return err
        }
        if !isPtr {
            valuep = valuep.Elem()
        }
        slicev.Set(reflect.Append(slicev, valuep))
    }
    return c.Err()
}


 类似资料:
  • 问题内容: 注意: 这要求与通常的元组到数组的转换相反。 我必须将一个参数传递给(包装的c ++)函数作为嵌套元组。例如,以下作品 而以下 不 不幸的是,我想使用的参数是一个numpy数组。对于某些N,该阵列的尺寸始终为2xN,这可能会很大。 有没有简单的方法可以将其转换为元组?我知道我可以循环遍历,创建一个新的元组,但是如果numpy数组提供了一些不错的访问权限,我会更喜欢。 如果不可能如我所愿

  • 问题内容: 我正在寻找将Java char数组转换为字节数组 而不创建中间体的方法,因为char数组包含密码。我查看了几种方法,但是它们似乎都失败了: 断言总是失败的(并且,至关重要的是,当在生产中使用该代码时,密码将被拒绝),但是print语句会打印出三次密码。为什么与和有所不同,却显得相同?我是否错过了空终止符之类的东西?我怎样做才能使转换和未转换工作? 问题答案: 问题是您使用构造函数,该构

  • 问题内容: 我可以将数组作为url参数传递的最佳方法是什么?我在想这是否可能: 还是这样: 香港专业教育学院阅读示例,但我发现它很混乱: 问题答案: 有一个非常简单的解决方案:。它把您的查询参数作为一个关联数组: 将返回 为您处理所有必需的转义(=> 和=> ),因此此字符串等于。

  • 问题内容: 我刚刚为组织此表中第70页上显示的查询层次结构数据的“关闭表”方法做了“更新/添加/删除”部分:http ://www.slideshare.net/billkarwin/sql-antipatterns- strike -背部 我的数据库如下所示: 表类别: 表类别树: 但是,从单个查询获取整棵树作为多维数组时,我遇到了一个问题。 这是我想回来的东西: 更新: 找到了此链接,但是我仍

  • 问题内容: 我要实现的是: 我怎样才能返回对象,而是如果? 问题答案: 我找到了解决方案。在结果上创建了扩展名。 并使用像

  • 问题内容: 我想将结果数组转换为PHP中的JSON格式。这是我的代码: 我想转换为JSON格式并将JSON数据传递给jQuery插件。 问题答案: 在php> 5.2.0中可用: