go语言,如何把map转为slice?


//把类似slice的map转为slice
func MapToSlice(input interface{}) []interface{} {
    output := []interface{}{}
    for i,l := 0,len(input); i < l; i++ {
        output = append(output,input[i])
    }
    return output
}

//用法
got := MapToSlice(map[int]string{
    0:"haha",
    1:"heihei",
    2:"hopho",
})
fmt.Println(got)

以上是错误的写法,因为len不能接收interface{}作为参数,也不能用input[i]的方式取值。

以上的函数如果input的类型改为map[int]interface{},则可以,但是编译时又会报传入的参数类型不正确

阅读 18k
4 个回答

当你以 interface 接受的时候,你对原来的值就一无所知了,但可以使用反射来获取它的值。

延用你的写法可以这样写:

//把类似slice的map转为slice
func MapToSlice(input interface{}) []interface{} {
    v := reflect.ValueOf(input)
    keys := v.MapKeys()
    output := []interface{}{}
    for i, l := 0, v.Len(); i < l; i++ {
        output = append(output, v.MapIndex(keys[i]))
    }
    return output
}

但需要注意的是,这里返回的值是 reflect.Value 类型

func MapToSlice(input map[interface{}]interface{}) []interface{} {
    output := []interface{}{}
    for key,value:=range input {
        fmt.Println(key,value)
        output = append(output,value)
    }
    return output
}

这样试试

目前只能遍历,建议使用并发安全的gmap包,可以通过Keys()和Values()方法返回对应的键/值slice。
gmap包API文档:https://godoc.org/github.com/...

是要把什么转成slice,是key还是value,说清楚,大哥。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏