如何解决将命名函数发送到另一个函数
我正在阅读本课程https://gobyexample.com/collection-functions,然后看到下一个代码:
package main
import (
"fmt"
"strings"
)
func Any(vs []string,f func(string) bool) bool {
for _,v := range vs {
if f(v) {
return true
}
}
return false
}
func main() {
var strs = []string{"peach","apple","pear","plum"}
fmt.Println(Any(strs,func(v string) bool {
return strings.HasPrefix(v,"p")
}))
}
具有匿名功能,可以正常工作。但是如何在那里使用命名函数?我尝试过:
...
fmt.Println(Any(strs,strings.HasPrefix("p")))
但是得到:
./prog.go:96:41: not enough arguments in call to strings.HasPrefix
have (string)
want (string,string)
./prog.go:96:41: cannot use strings.HasPrefix("p") (type bool) as type func(string) bool in argument to Any
我在做什么错了?
解决方法
Any()
的类型为func (string) bool
,而strings.HasPrefix()
的类型为func (string,string) bool
。无法直接传递。
这就是为什么首先使用函数文字的原因:传递具有正确类型的函数值。
如果您将具有一个带有此签名的命名函数,则可以传递它:
func check(s string) bool {
return strings.HasPrefix(s,"p")
}
并使用它:
fmt.Println(Any(strs,check))
哪个会输出(在Go Playground上尝试):
true
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。