将命名函数发送到另一个函数

我正在阅读本课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

我究竟做错了什么?


慕村9548890
浏览 102回答 1
1回答

12345678_0001

Any()需要 type 的函数值func (string) bool,但strings.HasPrefix()有 type func (string, string) bool。不能直接通过。这就是您首先使用函数文字的原因:传递具有正确类型的函数值。如果你有一个完全具有这个签名的命名函数,你可以传递它:func check(s string) bool {    return strings.HasPrefix(s, "p")}并使用它:fmt.Println(Any(strs, check))哪个会输出(在Go Playground上试试):true
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go