2014-12-25 54 views
6

我正在嘗試編寫函數Map,以便它可以處理所有類型的數組。如何在golang中爲通用參數編寫func

// Interface to specify generic type of array. 
type Iterable interface { 
} 

func main() { 
    list_1 := []int{1, 2, 3, 4} 
    list_2 := []uint8{'a', 'b', 'c', 'd'} 
    Map(list_1) 
    Map(list_2) 
} 

// This function prints the every element for 
// all []types of array. 
func Map(list Iterable) { 
    for _, value := range list { 
     fmt.Print(value) 
    } 
} 

但它會引發編譯時錯誤。

19: cannot range over list (type Iterable) 

該錯誤是正確的,因爲需要range數組,指針到一個數組,切片,字符串,地圖,或信道允許接收操作和這裏類型是Iterable。我認爲我面臨的問題是,將參數類型Iterable轉換爲數組類型。請建議,我如何使用我的函數來處理通用數組。

回答

5

如羅布派克在this thread

是否有可能表達在圍棋型開關「的任何地圖」,「任何陣列」或「任何切片」提到?

靜態類型必須精確
空的接口確實是一個類型,而不是通配符。

您只能遍歷特定類型的列表,如具有已知函數的接口。
可以看到一個例子用「Can we write a generic array/slice deduplication in go?

即使使用反射,通過一個切片作爲interface{}將是,如this thread shows,容易出錯(見this example)。

+0

中沒有'泛型',是否可以從接口參數中知道類型和值?我仍然試圖從共同的例子中瞭解它。 –

+0

@ subh.singh不是動態的,這就是爲什麼最好使用已知接口的數組而不是'interface {}'。 – VonC

+1

@ subh.singh至少不是沒有反思,就像http://play.golang.org/p/jxMFq5UYs1中提到的https://www.tbray.org/ongoing/When/201x/2013/07/15/Golang-日記-2。 – VonC

0

您對Map的定義有些不完整。通常的方式來聲明它會有mapper方法。 你舉的例子至少可以以這種方式實現

package main 

import "fmt" 

// Interface to specify something thet can be mapped. 
type Mapable interface { 
} 


func main() { 
    list_1 := []int{1, 2, 3, 4} 
    list_2 := []string{"a", "b", "c", "d"} 
    Map(print, list_1) 
    Map(print, list_2) 
} 
func print(value Mapable){ 
fmt.Print(value) 
} 

// This function maps the every element for 
// all []types of array. 
func Map(mapper func(Mapable), list ... Mapable) { 
    for _, value := range list { 
     mapper(value) 
    } 
} 

works。需要說這是一種無類型的。因爲不,Go在Hindley-Milner sence

+0

我想如果我們想對數組的元素進行一些操作,那麼我們必須去反思。在當前的例子中,我們正在打印該值,而不是對元素進行任何操作。 –

相關問題