代码之家  ›  专栏  ›  技术社区  ›  user8645601

无法理解某些Go代码

go
  •  2
  • user8645601  · 技术社区  · 7 年前

    当我阅读包“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首先包括另一个名为func(Addr)的func,以及这段代码如何实现注释所说的行为?

    3 回复  |  直到 7 年前
        1
  •  2
  •   k1m190r    7 年前
    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]
      }
    

    大写:

    1. 功能开启 addrs 已命名 first 退货 Addr strategy 参数,该参数必须是 地址 并返回 bool .
    2. for 每个 addr 在里面 range 属于 地址 应用函数 策略 在…上 地址
    3. 如果是 策略 func)返回 true
    4. 然后是整个功能 第一 返回: 地址
    5. 整体功能 第一 返回第一个 [0] 地址 从…起 地址 ,暗示:只有在以下情况下才会发生: 策略 地址 范围 属于 地址 返回 真的 .
        2
  •  1
  •   CallMeLoki    7 年前

    将策略视为一个过滤器函数,它只检查范围循环中的addr是否可以通过过滤器 另一种完全平等的方法是

    func strategy(addr Addr) bool {
        if addr == ... {
            return true
        }
    
        return false
    }
    
    func main(){
        addr := first(strategy)
    }
    
        3
  •  1
  •   Eugene Lisitsky    7 年前

    Func公司 first 接受作为参数 strategy 类型为的另一个函数 func(Addr) bool . 所以第二个函数应该取 Addr 作为输入和返回 bool 加法器是否正常。

    首先 地址 发现第一个函数退出并返回它。

    登录类似于过滤器-迭代列表,直到找到第一个匹配值。

    作为最后手段,如果没有人 value was get肯定回复第一个函数返回切片中的第一个值。