在阅读“net”包的代码时,我发现了一些类似以下的代码:

// first returns the first address which satisfies strategy, or if
// none do, then the first address of any kind.
func (addrs addrList) first(strategy func(Addr) bool) Addr {
    for _, addr := range addrs {
        if strategy(addr) {
            return addr
        }
    }
    return addrs[0]
}

我对为什么仿函数首先包含另一个名为func(Addr)的仿函数感到非常困惑,并且此代码如何实现注释所说的行为?

最佳答案

1 func (addrs addrList) first(strategy func(Addr) bool) Addr {
2    for _, addr := range addrs {
3        if strategy(addr) {
4            return addr
         }
     }
5    return addrs[0]
  }

换句话说:

名为addrsfirst上的
  • 函数返回Addr采用strategy参数,该参数必须是采用Addr并返回bool的函数。
  • for addrrange中的每个addrsstrategy上应用函数addr
  • ,如果它(strategy函数)返回true
  • ,然后整个函数first返回该addr
  • 整个函数first会从[0]返回第一个Addr addrs,这意味着:仅当strategyaddr中没有对rangeaddrs调用返回true时,才会发生。
  • 10-08 04:43