2017-01-18 10 views
0

誰かが私にこの構文を説明できるかどうか疑問に思っていました。 Googleマップは、APIを行くには、彼らはこのコードを理解する(golang)、double parantheses()()

type Client struct { 
    httpClient  *http.Client 
    apiKey   string 
    baseURL   string 
    clientID   string 
    signature   []byte 
    requestsPerSecond int 
    rateLimiter  chan int 
} 

// NewClient constructs a new Client which can make requests to the Google Maps WebService APIs. 
func NewClient(options ...ClientOption) (*Client, error) { 
    c := &Client{requestsPerSecond: defaultRequestsPerSecond} 
    WithHTTPClient(&http.Client{})(c)  //??????????? 
    for _, option := range options { 
     err := option(c) 
     if err != nil { 
      return nil, err 
     } 
    } 
    if c.apiKey == "" && (c.clientID == "" || len(c.signature) == 0) { 
     return nil, errors.New("maps: API Key or Maps for Work credentials missing") 
    } 

    // Implement a bursty rate limiter. 
    // Allow up to 1 second worth of requests to be made at once. 
    c.rateLimiter = make(chan int, c.requestsPerSecond) 
    // Prefill rateLimiter with 1 seconds worth of requests. 
    for i := 0; i < c.requestsPerSecond; i++ { 
     c.rateLimiter <- 1 
    } 
    go func() { 
     // Wait a second for pre-filled quota to drain 
     time.Sleep(time.Second) 
     // Then, refill rateLimiter continuously 
     for _ = range time.Tick(time.Second/time.Duration(c.requestsPerSecond)) { 
      c.rateLimiter <- 1 
     } 
    }() 

    return c, nil 
} 

// WithHTTPClient configures a Maps API client with a http.Client to make requests over. 
func WithHTTPClient(c *http.Client) ClientOption { 
    return func(client *Client) error { 
     if _, ok := c.Transport.(*transport); !ok { 
      t := c.Transport 
      if t != nil { 
       c.Transport = &transport{Base: t} 
      } else { 
       c.Transport = &transport{Base: http.DefaultTransport} 
      } 
     } 
     client.httpClient = c 
     return nil 
    } 
} 

を持っており、これはラインである私は

WithHTTPClient(&http.Client{})(c) 
NEWCLIENT

に理解していないのはなぜ二人は)()(があるのですか? WithHTTPClientは、その行が行う* http.Clientを受け取りますが、その上に宣言されたクライアント構造体へのポインタも渡しますか?

答えて

6

WithHTTPClientはすなわち、関数を返す:

func WithHTTPClient(c *http.Client) ClientOption { 
    return func(client *Client) error { 
     .... 
     return nil 
    } 
} 

WithHTTPClient(&http.Client{})(c)はちょうどパラメータとしてcで(クライアントへのポインタを)その関数を呼び出しています。

f := WithHTTPClient(&http.Client{}) 
f(c) 
と書くことができます。