英文:
Does Go allow a function to use another function as a parameter?
问题
问题发生在Go代码的第17行。以下是Python和Go的程序,这样你就可以看到我尝试做什么。Python可以工作,但我的Go尝试都失败了。我已经仔细阅读了golang.org,但在谷歌上没有找到任何结果。
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))
}
英文:
The problem is happening at line 17 in the Go code. Below is the program in python and Go so you can see exactly what I'm attempting to do. Python works, my Go attempts have all failed. Already read golang.org back to back, and google turned up nothing, as well.
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))
Now, the Go version which I'm having troubles with:
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))
}
答案1
得分: 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
我还对代码进行了一些清理,使其更符合惯用写法。我用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)
}
}
英文:
Yes, Go can have functions as parameters:
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))
}
The key is you need a type to pass in.
type Filter func(int) bool
I also cleaned up a bit of the code to make it more idiomatic. I replaced your for loops with range clauses.
for i := 0; i < len(b); i++ {
if filter(b[i]) == true {
c = append(c, b[i])
}
}
becomes
for _, i := range b {
if filter(i) {
c = append(c, i)
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论