2017-11-18 141 views
2

,我發現像這樣的代碼:無法理解一些Go代碼

// 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命名FUNC (Addr),以及該代碼如何實現評論所說的行爲?

+0

func(Addr)bool是參數_strategy_的**類型**。所以參數「策略」必須是一個函數,它需要_Addr_類型的東西並返回true或false。 – 2017-11-18 08:40:31

+0

所以,我想確認的一件事是:func(Addr)bool是類似「string」還是「int」的?但這個func如何返回滿足策略的第一個地址? – user8645601

回答

1

考慮戰略作爲過濾器的功能,它只檢查地址範圍內循環可通過過濾器或不 另一個完全平等的方式做,這是像

func strategy(addr Addr) bool { 
    if addr == ... { 
     return true 
    } 

    return false 
} 

func main(){ 
    addr := first(strategy) 
} 
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] 
    } 

在關鍵詞:

  1. 功能上addrs名爲first回報Addr花費strategy參數必須是一個函數,它需要Addr並返回bool
  2. foraddrsrange每個addraddr
  3. 應用功能strategy如果它(strategy FUNC)返回true
  4. 然後整體功能first返回該addr
  5. 整體功能first返回第一個[0]Addraddrs,暗示:只有當strategy呼叫addr時纔會發生中的0返回true
1

Func first接受作爲參數strategy另一種功能類型func(Addr) bool。 所以第二個函數應該以Addr作爲輸入並返回bool加法器是否正常。

作爲第一個這樣的Addr發現第一個函數退出並返回它。

登錄與過濾器類似 - 迭代列表直到找到第一個匹配值。

作爲最後的手段,如果沒有人Addr值得到肯定的答覆第一個函數返回片中的第一個值。