Why does calling .Bytes()
on a zero value big.Int
return a slice of length 0?
// uint64
var x uint64
xb := make([]byte, 8)
binary.BigEndian.PutUint64(xb, x)
// [0 0 0 0 0 0 0 0]
fmt.Println(xb)
// uint8
var y uint8
yb := []byte{byte(y)}
// [0]
fmt.Println(yb)
// big.Int
z := big.Int{}
zb := z.Bytes()
// [] Why is this an empty slice and not [0]
fmt.Println(zb)
CodePudding user response:
big.Int
stores the absolute value of the number it represents in a slice. big.Int
documents that "the zero value for an Int represents the value 0". So in the zero value (which represents 0
) the slice will be empty (zero value for slices is nil
and the length of a nil
slice is 0
).
The reasoning is simple: in cases where you don't use a big.Int
value, it won't require allocation for the slice. Zero is the most special and probably the most frequent value, using this simple trick is a "no-brainer" optimization.
See related question: Is there another way of testing if a big.Int is 0?