猿问

迭代一个接口

我想创建一个函数,它接受一个映射或一个数组,并迭代它,在每个项目上调用一个函数,该函数知道如何处理遇到的任何类型。


这是我第一次失败的尝试。目前,当我在实际用例中运行它时,它总是说“哦哦!”。


func DoTheThingToAllTheThings(data_interface interface{}) int {

    var numThings int


    switch data := data_interface.(type) {

    case map[interface{}]interface{}:

        numThings = len(data)

        for index, item := range data {

            DoTheThing(index, item)

    }

    case []interface{}:

        numThings = len(data)

        for index, item := range data {

            DoTheThing(index, item)

        }

    default:

        fmt.Println("uh oh!")

    }


    return numThings

}

数组或映射可能包含许多不同的内容,因此尝试匹配每个可能的输入不是一个选项。


换句话说,有没有办法在不确切知道它是什么的情况下迭代 Go 中的数组或映射?


喵喵时光机
浏览 170回答 2
2回答

慕桂英3389331

为了让您的示例工作,您需要构建一个interface{}(或映射)数组,以便检测到正确的类型:// This won't work, as the .(type) would be []SsomeS := []S{S{}}DoTheThingToAllTheThings(someS)// This will: it will go in case []interface{}:someSI := make([]interface{}, len(someS))for i, s := range someS {    someSI[i] = s}DoTheThingToAllTheThings(someSI)在此处查看完整示例。但这意味着您仍然可以interface{}在您的DoTheThing功能中使用。这里没有真正的泛型,正如我在“ Go 中的泛型是什么? ”中提到的。
随时随地看视频慕课网APP

相关分类

Go
我要回答