登录
首页 >  Golang >  Go问答

规范化参数列表,包括切片和数组

来源:stackoverflow

时间:2024-03-11 08:15:26 106浏览 收藏

本篇文章向大家介绍《规范化参数列表,包括切片和数组》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

如果我有这样的功能:

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;
}

但如果可能的话,我正在寻找一些不那么冗长的东西


解决方案


以下是如何将任意切片和数组展平为 []接口{}:

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

Run it on the Playground

如果函数必须处理具有任意元素类型的切片和数组类型,则应用程序必须使用 reflect api 迭代切片或数组,以将值获取到 []interface{} 中。

如果您只需要扁平化[]interface{},则不需要reflect 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)
}

Run it on the Playground

以上就是《规范化参数列表,包括切片和数组》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>