在Go

时间:2016-08-18 20:28:16

标签: arrays string function dictionary go

我在Go中编写一个计数器函数,它接受一个可迭代的数据结构(即数组,切片或字符串),然后计算该结构的元素:

func NewFreqDist(iterable interface{}) *FreqDist {
  fd := FreqDist{make(map[reflect.Value]int)}
  switch reflect.TypeOf(iterable).Kind() {
    case reflect.Array, reflect.Slice, reflect.String:
      i := reflect.ValueOf(iterable)
      for j := 0; j < i.Len(); j++ {
        fd.Samples[i.Index(j)]++
      }
    default:
      Code to handle if the structure is not iterable...
  }
  return &fd
}

FreqDist对象包含一个包含计数的地图(Samples)。但是,当我在函数外部打印地图时,它看起来像这样:

map[<uint8 Value>:1 <uint8 Value>:1]

使用键访问地图中的值无法正常工作。 答案表明使用reflect包来解决此问题的问题是here。 那么,如何在Go中遍历任意数据结构?

1 个答案:

答案 0 :(得分:1)

您链接的答案的最高评论是

  

唯一要添加的是s.Index(i)返回一个reflect.Value所以在我的情况下我需要s.Index(i).Interface()来引用实际值。 - 纽克隆

如果我正确理解您的问题,我相信这是您的解决方案。不要使用i.Index(j)在地图中定义关键字,请尝试i.Index(j).Interface()。您的地图需要为map[interface{}]int。这样,您可以在访问地图中的值时使用原始iterable中的数据作为键。

这是一个操场示例我(粗略地)改编自您的代码:https://play.golang.org/p/Rwtm9EOmyN

根据您的数据,您可能希望在某个时候使用CanInterface()以避免恐慌。