无法理解一些Go代码

时间:2017-11-18 08:29:28

标签: go

当我正在阅读包" 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)的函数,以及这段代码如何实现评论所说的行为?

3 个答案:

答案 0 :(得分:2)

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]
  }

用语言说:

    名为addrs的{​​{1}}上的
  1. 函数返回first获取Addr参数,该参数必须是一个需要strategy并返回Addr的函数。< / LI> {li> bool for addr range addrs strategy addrstrategy
  2. 如果它(true func)返回first
  3. 然后整个函数addr返回first
  4. 整个函数[0]Addr返回第一个addrs strategy,暗示:只有在addr没有调用range时才会发生这种情况} addrs true中{}返回{{1}}。

答案 1 :(得分:1)

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

.OfType<T>

答案 2 :(得分:1)

Func first接受另一个类型为strategy的函数func(Addr) bool。 因此,第二个函数应该以{{1​​}}作为输入并返回Addr,无论加法器是否正常。

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

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

作为最后的手段,如果没有一个Addr值获得肯定回复,则第一个函数返回切片中的第一个值。