func IsUint64SumOverflow(a, b uint64) bool {
	return math.MaxUint64-a < b
}
Returns whether a + b would be a uint64 overflow
package binary
import (
	"encoding/binary"
	"math"
	"math/big"
	"sort"
)
var big1 = big.NewInt(1)
var Big256 = big.NewInt(256)
var tt256 = new(big.Int).Lsh(big1, 256)
var tt256m1 = new(big.Int).Sub(new(big.Int).Lsh(big1, 256), big1)
var tt255 = new(big.Int).Lsh(big1, 255)
type Uint64Slice []uint64
func (p Uint64Slice) Len() int           { return len(p) }
func (p Uint64Slice) Less(i, j int) bool { return p[i] < p[j] }
func (p Uint64Slice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
func (p Uint64Slice) Sort()              { sort.Sort(p) }
func SearchUint64s(a []uint64, x uint64) int {
	return sort.Search(len(a), func(i int) bool { return a[i] >= x })
}
func (p Uint64Slice) Search(x uint64) int { return SearchUint64s(p, x) }
func PutUint64LE(dest []byte, i uint64) {
	binary.LittleEndian.PutUint64(dest, i)
}
func GetUint64LE(src []byte) uint64 {
	return binary.LittleEndian.Uint64(src)
}
func PutUint64BE(dest []byte, i uint64) {
	binary.BigEndian.PutUint64(dest, i)
}
func GetUint64BE(src []byte) uint64 {
	return binary.BigEndian.Uint64(src)
}
func PutInt64LE(dest []byte, i int64) {
	binary.LittleEndian.PutUint64(dest, uint64(i))
}
func GetInt64LE(src []byte) int64 {
	return int64(binary.LittleEndian.Uint64(src))
}
func PutInt64BE(dest []byte, i int64) {
	binary.BigEndian.PutUint64(dest, uint64(i))
}
func GetInt64BE(src []byte) int64 {
	return int64(binary.BigEndian.Uint64(src))
}