2014-02-06 77 views
4

問題發生在Go代碼的第17行。下面是Python和Go中的程序,以便您可以看到我正在嘗試執行的操作。 Python工作,我的Go嘗試都失敗了。已經讀到golang.org背對背,谷歌也沒有出現。Go是否允許函數使用另一個函數作爲參數?

def my_filter(x): 
    if x % 5 == 0: 
    return True 
    return False 

#Function which returns a list of those numbers which satisfy the filter 
def my_finc(Z, my_filter): 

    a = [] 
    for x in Z: 
    if my_filter(x) == True: 
     a.append(x) 
    return a 

print(my_finc([10, 4, 5, 17, 25, 57, 335], my_filter)) 

現在,這我遇到的麻煩圍棋版本:

package main 

import "fmt" 

func Filter(a []int) bool { 
    var z bool 
    for i := 0; i < len(a); i++ { 
     if a[i]%5 == 0 { 
      z = true 
     } else { 
      z = false 
     } 
    } 
    return z 
} 

func finc(b []int, Filter) []int { 
    var c []int 
    for i := 0; i < len(c); i++ { 
     if Filter(b) == true { 
      c = append(c, b[i]) 
     } 
    } 
    return c 
} 

func main() { 
    fmt.Println(finc([]int{1, 10, 2, 5, 36, 25, 123}, Filter)) 
} 

回答

8

是,進入可以有功能參數:

package main 

import "fmt" 

func myFilter(a int) bool { 
    return a%5 == 0 
} 

type Filter func(int) bool 

func finc(b []int, filter Filter) []int { 
    var c []int 
    for _, i := range b { 
     if filter(i) { 
      c = append(c, i) 
     } 
    } 
    return c 
} 

func main() { 
    fmt.Println(finc([]int{1, 10, 2, 5, 36, 25, 123}, myFilter)) 
} 

關鍵是你需要一個類型通過。

type Filter func(int) bool 

我也清理了一些代碼以使其更具慣用性。我用range子句替換了for循環。

for i := 0; i < len(b); i++ { 
    if filter(b[i]) == true { 
     c = append(c, b[i]) 
    } 
} 

成爲

for _, i := range b { 
    if filter(i) { 
     c = append(c, i) 
    } 
} 
+2

尼斯的答案。作爲註釋,'type Filter'不是強制性的(但推薦),而不是寫'func finc(b [] int,filter Filter)[] int {'它們可以使用'func finc(b [] int,filter func(int)bool)[] int {' – zk82

相關問題