【问题标题】:how to pass different types to a function如何将不同类型传递给函数
【发布时间】:2016-02-28 22:21:40
【问题描述】:

我有两个 golang 函数,做完全相同的事情,一个输入切片,另一个输入地图。我想将其组合成一个功能,以避免重复。

func DoSomething([]data) {
//do something.
}

func DoSomething(map[string]data) {
    //do something.
}

组合函数可能如下所示:

    func DoSomethingNew (param type) {
       //param could be map or slice
    }

我想知道是否可以将不同的类型传递给 golang 中的同一个函数以及如何传递。我用谷歌搜索但找不到任何相关的东西。

【问题讨论】:

    标签: go


    【解决方案1】:

    你可以使用接口Go Playground

    func F(data interface{}) {
        switch data.(type){
        case []int:
            fmt.Println("Slice")
            fmt.Println(data)
        case map[string]int:
            fmt.Println("Map")
            fmt.Println(data)
        }
    
        fmt.Println()
    }
    

    您实际检查类型并根据类型执行某些操作的位置。

    【讨论】:

    • 感谢您的回答,我有一个后续问题,尽管我得到了原始问题的答案。接口解决问题。但我不想检测类型(如果可能的话,我也只希望 map 或 slice 类型)然后有一个使用数据范围的 for 循环。这似乎不起作用:play.golang.org/p/jggFscxfHx。因为我无法覆盖界面。
    • @GauravSinha 看看这个 Q/A stackoverflow.com/questions/14025833/… 听起来就像你想要的一样。
    • 不错,对反射不太了解。谢谢 :) :thumbsup
    • 现在看我的代码,我想我仍然在新函数中重复我的代码。唯一的区别是它现在是一个开关盒的形式,而不是两个功能。不过学习接口和反射还是不错的。
    【解决方案2】:

    有几种方法可以做到这一点,但最简单的方法是让DoSomethingNew 接受interface{} 类型。然后在方法内部进行类型切换,或者在这种情况下只有两个选项,可能只有一个类型断言,然后是另一个,如果两者都失败则返回错误。另一种选择是将两者都作为参数并在函数内部使用类似的 if、else-if、else 模式检查 nil,以在输入不是您要查找的两种类型时处理错误。为了使您的代码更安全,您可以使用比所有类型都实现的空接口更严格的接口。您还可以做一些方法链接,甚至使用类型本身作为接收类型来实现方法。这是一个显示一些想法的示例; https://play.golang.org/p/_v2AyFjGzv

    【讨论】:

      猜你喜欢
      • 2018-01-02
      • 2020-02-06
      • 1970-01-01
      • 2018-03-26
      • 2017-05-10
      • 2019-10-10
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多