我在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中遍历任意数据结构?
答案 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()
以避免恐慌。