【问题标题】:How to get the keys as string array from map?如何从地图中获取键作为字符串数组?
【发布时间】:2019-08-12 19:46:26
【问题描述】:

我需要使用strings.Join(invoicesBatch, ",") 来加入一个字符串数组。但是我使用reflect.ValueOf(invoiceList).MapKeys() 从地图中得到的数组是reflect.Value 数组。有没有一种简单的方法可以将它们转换为字符串数组。

地图是用字符串键初始化的。

【问题讨论】:

  • 简单的意思是要避免编写循环并将每个值转换为字符串?
  • 是的。如果我使用循环,那么使用 string.Join 毫无意义。有办法吗?
  • 如果你知道invoiceList的映射类型,你可以使用类型断言将其转换为映射类型,然后循环遍历映射的键
  • map的key是string,value是自定义对象。但是当我调用 MapKeys() 它返回 reflet.Value 数组而不是字符串。我只想将键作为原始数据类型的数组,如 Java。
  • 要么我需要数组作为地图中的字符串 [],要么我必须将数组从 reflect.Value 转换为字符串(不想循环它们并每次都创建一个新数组)。其中任何一个都是可能的?

标签: go


【解决方案1】:

您可以使用 for 循环和范围来获取这样的键片段,而不是使用反射

package main

import (
"fmt"
"strings"
)

func main() {
  data := map[string]int{
      "A": 1,
      "B": 2,
  }
  keys := make([]string, 0, len(data))
  for key := range data {
    keys = append(keys, key)
  }

  fmt.Print(strings.Join(keys, ","))
}

【讨论】:

  • keys := make([]string, 0, len(data)),否则结果字符串的开头会有逗号。
  • 不需要 key ,_ key := 范围数据更干净
【解决方案2】:

您将需要使用循环,但您不需要每次都创建一个新切片,因为我们已经知道长度。示例:

func main() {
    a := map[string]int{
        "A": 1, "B": 2,
    }
    keys := reflect.ValueOf(a).MapKeys()
    strkeys := make([]string, len(keys))
    for i := 0; i < len(keys); i++ {
        strkeys[i] = keys[i].String()
    }
    fmt.Print(strings.Join(strkeys, ","))
}

【讨论】:

  • 希望别无他法
  • 看来这种方法比@zola 的提议效果更好。虽然作为一名 Python 开发人员,我有点惊讶我们需要使用反射来获取字典键 :)
  • 完全没有必要为此使用反射。请参阅下面的答案以获得更好的方法。
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多