2014-02-06 4 views
4

Проблема возникает в строке 17 в коде Go. Ниже приведена программа в python и Go, чтобы вы могли точно видеть, что я пытаюсь сделать. Python работает, мои попытки Go все провалились. Уже читал golang.org, и google тоже ничего не показывал.Does 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)) 

Теперь версия Go, которая у меня проблемы с:

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

Да, Go может иметь функции в качестве параметров:

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 

Я также убрал немного кода, чтобы сделать его более идиоматичным. Я заменил ваши циклы диапазоном предложениями диапазона.

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

Хороший ответ. В качестве комментария, 'Тип Фильтр' не является обязательным (но рекомендуется), вместо того, чтобы называть' func finc (b [] int, filter Filter) [] int {'они могут использовать' func finc (b [] int, filter func (int) bool) [] int {' – zk82

Смежные вопросы