在ioutil包中比较相同的值?

在ioutil包中比较相同的值?

问题描述:

I'm puzzled by what this line of code does from the ioutil package. It appears to compare the same value twice but casts it twice on one side. Any insights would be greatly appreciated!

int64(int(capacity)) == capacity

from this function

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
}

Converting Tim Cooper's comment into an answer.

bytes.Buffer.Grow takes in an int and capacity is int64.

func (b *Buffer) Grow(n int)

Grow grows the buffer's capacity, if necessary, to guarantee space for another n bytes. After Grow(n), at least n bytes can be written to the buffer without another allocation.

As mentioned in GoDoc, Grow is used as an optimisation to prevent further allocations.

int64(int(capacity)) == capacity makes sure that capacity is within the range of int values so that the optimisation can be applied.