当我正在阅读包" 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)的函数,以及这段代码如何实现评论所说的行为?
答案 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}}上的first
获取Addr
参数,该参数必须是一个需要strategy
并返回Addr
的函数。< / LI>
{li> bool
for
addr
range
addrs
strategy
addr
上strategy
true
func)返回first
addr
返回first
[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
值获得肯定回复,则第一个函数返回切片中的第一个值。