泛型函數(shù)
- Go 語言提供了多種代替方法來避免創(chuàng)建一些除了處理的數(shù)據類型不同外其他完全相同的函數(shù)
- 下面就是一個支持泛型的
Minimum()
函數(shù)的例子:
i := Minimum(4, 3, 8, 2, 9).(int)
fmt.Printf("%T %v\n", i, i)
f := Minimum(9.4, -5.4, 3.8, 17.0, -3.1, 0.0).(float64)
fmt.Printf("%T %v\n", f, f)
s := Minimum("K", "X", "B", "C", "CC", "CA", "D", "M").(string)
fmt.Printf("%T %v\n", s, s)
- 這個函數(shù)返回一個
interface{}
類型的值,我們使用一個非檢查類型斷言將值轉換我們所期待的值
func Minimum(first interface{}, rest ...interface{}) interface{} {
minimum := first
for _, x := range rest {
switch x := x.(type) {
case int:
if x < minimum.(int) {
minimum = x
}
}
case float64:
if x < minimum.(float64) {
minimum = x
}
}
case string:
if x < minimum.(string) {
minimum = x
}
}
}
return minimum
}
- 使用
interface{}
作為參數(shù)的類型,這樣我們可以傳入任意類型的數(shù)據
-
reflect.Value.Interface()
函數(shù)將它的值以 interface{}
類型提取出來
高階函數(shù)
- 高階函數(shù)就是將一個或者多個其他函數(shù)作為自己的函數(shù)微饥,并在函數(shù)體內調用它們
- 簡單的高階函數(shù)例子:
func SliceIndex(limit int, predicate func(i int) bool) int {
for i := 0; i < limit; i++ {
if predicate(i) {
return i
}
}
return -1
}
- 高階函數(shù)中也可以傳入匿名函數(shù),例子:
xs := []int{2, 4, 6, 8}
ys := []string{"C", "B", "K", "A"}
fmt.Println(
SliceIndex(len(xs), func(i int) boot {return xs[i] == 5}),
SliceIndex(len(xs), func(i int) boot {return xs[i] == 6}),
SliceIndex(len(ys), func(i int) boot {return ys[i] == "Z"}),
SliceIndex(len(ys), func(i int) boot {return ys[i] == "A"})
)
- 因為匿名函數(shù)是一個閉包你雌,所以它們引用的
xs
和 ys
切片必須和這個函數(shù)被創(chuàng)建的地方在同一個作用域
純記憶函數(shù)
- 純記憶函數(shù)就是對同一組輸入總是產生相同的結果止吐,不存在任何副作用
- 如果一個純函數(shù)執(zhí)行時開銷很大而且頻繁的使用相同的參數(shù)進行調用最住,我們可以使用記憶功能來降低處理的開銷
- 例子:
func Memoize(function memoizeFunction) memoizeFunction {
cache := make(map[string]interface{})
return func(x int, xs ...int) interface{} {
key := fmt.Sprint(x)
for _, i := range xs {
key += fmt.Sprintf(", %d", i)
}
if value, found := cache[key]; found {
return value
}
value := function(x, xs...)
cache[key] = value
return value
}
}