学习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相关知识,快来关注吧!