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

展平参数列表,其中参数可以是切片或数组

全冥夜
2023-03-14
问题内容

如果我有这样的功能:

func AcceptsAnything(v ...interface{}){
  args =: FlattenDeep(v);  // flatten any arrays or slices
}

我正在尝试实现FlattenDeep:

func getKind(v interface{}) string {

    rt := reflect.TypeOf(v)
    switch rt.Kind() {
    case reflect.Slice:
        return "slice"
    case reflect.Array:
        return "array"
    default:
        return "unknown"
    }

}

func FlattenDeep(args ...interface{}) []interface{} {
    list := []interface{}{}

   for _, v := range args {

     kind := getKind(v);

     if kind != "unknown" {
        list = append(list, FlattenDeep(v)...)  // does not compile
     } else{
        list = append(list, v);
       }
    }
   return list;
}

但我不知道如何一次将多个项目添加到列表中。我应该只在FlattenDeep的结果上循环还是有一种方法可以分散结果并将它们附加到列表中?

这可能起作用:

func FlattenDeep(args ...interface{}) []interface{} {
    list := []interface{}{}

    for _, v := range args {

        kind := getKind(v);
        if kind != "unknown" {
            for _, z := range FlattenDeep((v.([]interface{})...) {
                list = append(list, z)
            }

        } else {
            list = append(list, v);
        }
    }
    return list;
}

但我正在寻找一些不太详细的东西


问题答案:

以下是将任意切片和数组展平为[] interface {}的方法:

func flattenDeep(args []interface{}, v reflect.Value) []interface{} {

    if v.Kind() == reflect.Interface {
        v = v.Elem()
    }

    if v.Kind() == reflect.Array || v.Kind() == reflect.Slice {
        for i := 0; i < v.Len(); i++ {
            args = flattenDeep(args, v.Index(i))
        }
    } else {
        args = append(args, v.Interface())
    }

    return args
}

func AcceptsAnything(v ...interface{}) {
    args := flattenDeep(nil, reflect.ValueOf(v))
    fmt.Println(args)
}

在操场上运行

如果函数必须处理具有任意元素类型的切片和数组类型,则应用程序必须使用反射API遍历切片或数组,以将值放入[] interface {}。

如果只需要展平[] interface {},则不需要反射API:

func flattenDeep(args []interface{}, v interface{}) []interface{} {
    if s, ok := v.([]interface{}); ok {
        for _, v := range s {
            args = flattenDeep(args, v)
        }
    } else {
        args = append(args, v)
    }
    return args
}

func AcceptsAnything(v ...interface{}) {
    args := flattenDeep(nil, v)
    fmt.Println(args)
}

在Playground上运行它。



 类似资料:
  • 问题内容: 假设我有一个带两个参数的python函数,但我希望第二个arg是可选的,默认值是作为第一个参数传递的参数。所以,我想做这样的事情: 除非那行不通。我能想到的唯一解决方法是: 有一个更好的方法吗? 问题答案: 正如@Ignacio所说,您不能这样做。在后面的示例中,您可能会遇到的有效值。在这种情况下,您可以使用前哨值:

  • 问题内容: 我正在使用的软件包gosqlite的方法带有 可变 参数,其类型为 空接口 。 如果显式传递各个参数,我可以称呼它为好: 但是,由于可变参数与我的SQL语句的运算符内的占位符相对应,因此这些占位符的数目在编译时未知,但会在运行时根据用户的操作动态变化。例如,如果用户输入四个值,我最终会得到类似于以下的SQL: 所以自然地我想用一片字符串来调用该方法: 这不会编译。我可以通过创建一个空的

  • 问题内容: 看来我有NumPy数组列表()格式的数据: 我正在尝试将其放入polyfit函数中: 但是,它返回错误: 我认为我需要将数据拼合为: 我已经尝试了通常在列表列表上都可以使用的列表理解,但是按预期的方法却没有效果: 最好的方法是什么? 问题答案: 可以使用,顾名思义,它基本上将这样一个输入列表的所有元素连接到单个NumPy数组中,如下所示- 如果您希望最终输出为列表,则可以扩展解决方案,

  • 支持可变长参数列表的函数可以支持任意个传入参数,比如fmt.Println函数就是一个支持可变长参数列表的函数。 package main import "fmt" // 这个函数可以传入任意数量的整型参数 func sum(nums ...int) { fmt.Print(nums, " ") total := 0 for _, num := range nums {

  • 问题内容: 我正在努力查看将值传递给函数时使用哪种方法是否有明显的优势。下面的代码可能不是解释我要做出的决定的最佳示例,但我认为这是最容易理解的示例。 可变参数方法 数组参数法 两种技术中的哪一种是首选?如果是这样,为什么(速度,可靠性或只是易于阅读)?谢谢。 问题答案: 我认为没有速度差异。因为,在功能内部,您可以像一样使用。 我认为如果参数数量较少(例如小于5个),则因为易于阅读,可能是一个更

  • 列参数定义在 jQuery.fn.bootstrapTable.columnDefaults。 名称 标签 类型 默认 描述 radio data-radio Boolean false 是否显示为单选按钮 checkbox data-checkbox Boolean false 是否显示为筛选框 field data-field String undefined 字段名称 title data-