登录
首页 >  Golang >  Go问答

从任何值类型的字典中获取字符串键的切片

来源:stackoverflow

时间:2024-03-28 20:00:29 231浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《从任何值类型的字典中获取字符串键的切片》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我想编写一个函数来从映射中获取所有键作为字符串切片,其中键类型是字符串,值可以是任何其他类型。

像这样,但可以有任何类型的地图[字符串]...作为输入。

func mapLowCaseKeys(v map[string]string) []string {
    keys := make([]string, len(v))
    i := 0
    for key := range v {
        keys[i] = strings.ToLower(key)
        i++
    }
    return keys
}

实际上我想在javascript中实现object.keys()

我尝试使用 map[string]interface{} 作为函数的参数类型,但它不能只将任何特定映射传递给该函数,这在 golang 中可能吗?


解决方案


您可以使用 reflect 包中的 mapkeys 来执行此操作(参考:https://golang.org/pkg/reflect/#Value.MapKeys)。

mapkeys 返回一个切片,其中包含映射中存在的所有键(按未指定的顺序)。如果 v 的 kind 不是 map,它会发生恐慌。如果 v 表示 nil 映射,则它返回一个空切片。

下面给出了一个例子(演示链接:https://play.golang.org/p/xhDtmbGUyz0):

package main

import (
    "fmt"
    "reflect"
)

func main() {
    fmt.Println(mapLowCaseKeys(map[string]float64{
        "key1" : 1.2,
    }))

    fmt.Println(mapLowCaseKeys(map[string]interface{} {
        "key1" : 1.2,
        "key2" : map[string]string{"kk": "3"},
    }))

    fmt.Println(mapLowCaseKeys(map[int]float64{
         11 : 1.2,
    }))

    fmt.Println(mapLowCaseKeys(nil))
}

func mapLowCaseKeys(v interface{}) []string {
    keys := []string{}
    value := reflect.ValueOf(v)
    if value.Kind() == reflect.Map {
        for _, v := range value.MapKeys() {
            if v.Kind() == reflect.String {
                keys = append(keys, v.String())
            }
        }
        return keys
    } else {
        fmt.Println("it is not a map!!")
        return keys
    }
}

终于介绍完啦!小伙伴们,这篇关于《从任何值类型的字典中获取字符串键的切片》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

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