首页 > 后端开发 > Golang > 如何在 Go 中迭代未知的数据结构?

如何在 Go 中迭代未知的数据结构?

Susan Sarandon
发布: 2024-12-17 15:46:10
原创
487 人浏览过

How Can I Iterate Over Unknown Data Structures in Go?

在不知道确切类型的情况下迭代 Go 中的数据结构

问题:

我们如何迭代数据结构(数组或映射)在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板