2014-06-29 61 views
3

我今天開始學習Go,所以這可能是一個愚蠢的問題。我習慣於PHP,因此我不必聲明變量類型。Golang(初學者):避免重複函數來處理字符串或整數

我目前正在將一些常用的PHP函數轉換爲Go函數。我有一個將數組轉換爲哈希表的函數,以便稍後進行快速查找(比遍歷數組遍歷更快,以查看值是否存在,取而代之的是數值)。

在我看來,我必須創建兩個單獨的函數,一個用於字符串,另一個用於整數(因爲我不需要帶符號整數,所以uint)。爲了維護起見,我希望有一個函數可以接受stringuint並返回相同的結果,即它可以工作並返回我最初傳遞給該函數的任何東西。

目前我有這樣的:

// Array2Map_string makes a map out of an array of strings: word=>false 
func Array2Map_string(a []string) map[string]bool { 
    mc := make(map[string]bool) 
    for _,tok := range a { 
     mc[tok]=false 
     } 
    return mc 
} 

// Array2Map_int makes a map out of an array of integers: int=>false 
func Array2Map_int(a []uint) map[uint]bool { 
    mc := make(map[uint]bool) 
    for _,tok := range a { 
     mc[tok]=false 
     } 
    return mc 
} 

我想是有一個單一的功能,將創建並返回一個字符串基於哈希表的,如果我發送一個字符串數組功能,或UINT基於哈希表如果我發送一個uint數組到該函數。例如:

// Array2Map makes a map out of an array of strings whereby the key is 
func Array2Map(a []whatever) map[whatever]bool { 
    mc := make(map[whatever]bool) 
    for _,tok := range a { 
     mc[tok]=false 
     } 
    return mc 
} 

這可能嗎? 。

+1

簡短的回答:http://golang.org/ doc/effective_go.html#interface_conversions - 並將其稱爲SliceToMap,因爲[] uint或[]字符串是Go中的一個切片,您的函數將接受一個接口{},鍵入斷言,創建一個新地圖並覆蓋舊地圖在將新地圖作爲接口返回之前,將每個值複製到新地圖中。調用者需要在檢查密鑰之前鍵入斷言地圖 – elithrar

+2

似乎這可能比僅使用兩個單獨的函數更復雜。 – Alasdair

+0

查看[gen](http://clipperhouse.github.io/gen/)項目的想法,使其成爲如果你需要的不僅僅是兩個,那麼就不那麼痛苦了。 –

回答

3

泛型不存在圍棋尚(雖然有很多的discussion關於它的現在,我覺得你目前的方向是唯一的選擇