2015-11-25 40 views
3

我有两个golang函数,完成同样的事情,一个需要输入切片,另一个需要一个地图作为输入。我想将它合并为一个函数,以避免重复。如何将不同类型传递给函数

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

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

组合的功能可能看起来像:

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

我想知道是否可以通过不同类型相同的功能golang以及如何。我google搜索,但无法找到任何相关的。

回答

7

可以使用接口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() 
} 

,你其实检查的类型,做基于该类型的东西。

+0

感谢您的回答,我有一个后续问题,虽然我得到了我原来的问题的答案。接口解决了这个问题。但我不想检测类型(如果可能的话,我也希望只有map或slice类型),然后使用范围覆盖数据的for循环。这似乎不工作:https://play.golang.org/p/jggFscxfHx。因为我无法覆盖界面。 –

+1

@GauravSinha看看这个Q/A http://stackoverflow.com/questions/14025833/range-over-interface-which-stores-a-slice它听起来就像你想要的东西。 –

+1

不错,对反射不太了解。谢谢:):thumbsup –

3

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

相关问题