我正在尝试创建一个可以接受以下内容的函数
*struct
[]*struct
map[string]*struct
这里的结构可以是任何结构,而不仅仅是一个特定的结构。将接口转换为 *struct
或 []*struct
工作正常。但是给地图错误。
反射后它显示它是 map[] 但在尝试遍历范围时出错。
这是代码
package main
import (
"fmt"
"reflect"
)
type Book struct {
ID int
Title string
Year int
}
func process(in interface{}, isSlice bool, isMap bool) {
v := reflect.ValueOf(in)
if isSlice {
for i := 0; i < v.Len(); i++ {
strct := v.Index(i).Interface()
//... proccess struct
}
return
}
if isMap {
fmt.Printf("Type: %v\n", v) // map[]
for _, s := range v { // Error: cannot range over v (type reflect.Value)
fmt.Printf("Value: %v\n", s.Interface())
}
}
}
func main() {
b := Book{}
b.Title = "Learn Go Language"
b.Year = 2014
m := make(map[string]*Book)
m["1"] = &b
process(m, false, true)
}
有什么方法可以转换 interface{}
以映射和迭代或获取它的元素。
原文由 SamTech 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果映射值可以是任何类型,则使用 reflect 遍历映射:
游乐场示例
如果有一小部分已知的结构类型,则可以使用 类型开关: