2015-11-25 86 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