2017-10-13 7 views
0

私はこのコード行がioutilパッケージから何をするのか疑問に思います。同じ値を2回比較するように見えますが、片側を2回キャストします。どんな洞察も大いに評価されるだろう!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

ああ、ありがとう、 –

+0

小さな技術的な詳細: 'しかし、それを2回キャストする ' - Goはタイプキャストを実行せず、タイプ変換のみを行います。 – Flimzy

答えて

2

答えにTim Cooperのコメントを変換します。

bytes.Buffer.Growはintをとり、容量はint64です。

FUNC(B *バッファ)は、必要に応じて

グロウは 別のnバイトのためのスペースを確保するために、バッファの容量を増大する(nはint型)成長します。 Grow(n)の後、別の割り振りなしで少なくともnバイトをバッファーに書き込むことができます。

GoDocで説明したように、さらなる割り当てを防ぐための最適化として、Growが使用されています。

は、最適化を適用できるように容量がint値の範囲内にあることを確認します。

関連する問題