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

Send named function to another function

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