2017-10-13 82 views
0

我對ioutil軟件包中的這行代碼的作用感到困惑。它似乎將兩次相同的值進行比較,但在一側投射兩次。任何見解將不勝感激!比較ioutil包中的相同值嗎?

int64(int(capacity)) == capacity 

這個函數

func readAll(r io.Reader, capacity int64) (b []byte, err error) { 
    var buf bytes.Buffer 
    // If the buffer overflows, we will get bytes.ErrTooLarge. 
    // Return that as an error. Any other panic remains. 
    defer func() { 
     e := recover() 
     if e == nil { 
      return 
     } 
     if panicErr, ok := e.(error); ok && panicErr == bytes.ErrTooLarge { 
      err = panicErr 
     } else { 
      panic(e) 
     } 
    }() 
    if int64(int(capacity)) == capacity { 
     buf.Grow(int(capacity)) 
    } 
    _, err = buf.ReadFrom(r) 
    return buf.Bytes(), err 
} 
+6

這是檢查整數溢出。 –

+0

Ahh我看到了,謝謝 –

+0

一個小技術細節:'但是投了兩次 - Go不做類型轉換,只轉換類型。 – Flimzy

回答

2

轉換Tim Cooper的評論到答案。

bytes.Buffer.Grow需要一個int並且容量是int64。

FUNC(B *緩衝區)成長(N INT)

的Grow生長的緩衝區的容量,如果需要的話,爲了保證空間 另一個n個字節。在Grow(n)之後,至少有n個字節可以寫入 緩衝區,而不需要另外分配。

正如在GoDoc中所提到的,Grow被用作防止進一步分配的優化。

int64(int(capacity)) == capacity 確保容量在int值的範圍內,以便可以應用優化。

相關問題