问题:
我们如何迭代数据结构(数组或映射)在 Go 中没有确切的知识type?
尝试失败:
下面的代码尝试迭代表示映射或数组的接口并对每个项目执行函数,但失败由于类型检查
func DoTheThingToAllTheThings(data_interface interface{}) int { var numThings int switch data := data_interface.(type) { case map[interface{}]interface{}: numThings = len(data) // ... case []interface{}: numThings = len(data) // ... default: fmt.Println("uh oh!") } return numThings }
解决方案:
fmt.Printf("%vn", data_interface) 函数提供了一种无需类型即可迭代数据结构的方法 -
func PrintData(data_interface interface{}) { fmt.Printf("%v\n", data_interface) }
这有效是因为 fmt.Printf 中的 %v 动词使用反射来确定参数的类型并相应地打印它。
Go中的反射:
fmt.Printf函数内部使用reflect包来检查参数的类型参数并决定如何格式化它。 Reflect.ValueOf(arg)返回一个reflect.Value对象,它代表参数的实际值,reflect.TypeOf(arg)返回值的类型。
示例:
以下代码反映了一个 Board 结构,然后将其重新构造为相同的新变量type.
type Board struct { Tboard [9]string Player1 Player Player2 Player } func main() { myBoard := makeBoard() v := reflect.ValueOf(*myBoard) t := v.Type() var b2 Board b2 = v.Interface().(Board) fmt.Printf("v converted back to: %#v\n", b2) }
注意:
为了使用反射,必须导出数据结构的类型,这意味着它必须以大写字母开头。
以上是如何在 Go 中迭代未知的数据结构?的详细内容。更多信息请关注PHP中文网其他相关文章!