datasize 
Golang helpers for data sizes
Constants
Just like time package provides time.Second, time.Day constants datasize provides:
datasize.B 1 byte
datasize.KB 1 kilobyte
datasize.MB 1 megabyte
datasize.GB 1 gigabyte
datasize.TB 1 terabyte
datasize.PB 1 petabyte
datasize.EB 1 exabyte
Helpers
Just like time package provides duration.Nanoseconds() uint64 , duration.Hours() float64 helpers datasize has.
ByteSize.Bytes() uint64
ByteSize.Kilobytes() float64
ByteSize.Megabytes() float64
ByteSize.Gigabytes() float64
ByteSize.Terabytes() float64
ByteSize.Petabytes() float64
ByteSize.Exabytes() float64
Warning: see limitations at the end of this document about a possible precision loss
Parsing strings
datasize.ByteSize implements TextUnmarshaler interface and will automatically parse human readable strings into correct values where it is used:
"10 MB" -> 10* datasize.MB
"10240 g" -> 10 * datasize.TB
"2000" -> 2000 * datasize.B
"1tB" -> datasize.TB
"5 peta" -> 5 * datasize.PB
"28 kilobytes" -> 28 * datasize.KB
"1 gigabyte" -> 1 * datasize.GB
You can also do it manually:
var v datasize.ByteSize
err := v.UnmarshalText([]byte("100 mb"))
Printing
Bytesize.String() uses largest unit allowing an integer value:
(102400 * datasize.MB).String() -> "100GB"
(datasize.MB + datasize.KB).String() -> "1025KB"
Use %d format string to get value in bytes without a unit.
JSON and other encoding
Both TextMarshaler and TextUnmarshaler interfaces are implemented - JSON will just work. Other encoders will work provided they use those interfaces.
Human readable
ByteSize.HumanReadable() or ByteSize.HR() returns a string with 1-3 digits, followed by 1 decimal place, a space and unit big enough to get 1-3 digits
(102400 * datasize.MB).String() -> "100.0 GB"
(datasize.MB + 512 * datasize.KB).String() -> "1.5 MB"
Limitations
- The underlying data type for
data.ByteSize is uint64, so values outside of 0 to 2^64-1 range will overflow
- size helper functions (like
ByteSize.Kilobytes()) return float64, which can't represent all possible values of uint64 accurately:
- if the returned value is supposed to have no fraction (ie
(10 * datasize.MB).Kilobytes()) accuracy loss happens when value is more than 2^53 larger than unit: .Kilobytes() over 8 petabytes, .Megabytes() over 8 exabytes
- if the returned value is supposed to have a fraction (ie
(datasize.PB + datasize.B).Megabytes()) in addition to the above note accuracy loss may occur in fractional part too - larger integer part leaves fewer bytes to store fractional part, the smaller the remainder vs unit the move bytes are required to store the fractional part
- Parsing a string with
Mb, Tb, etc units will return a syntax error, because capital followed by lower case is commonly used for bits, not bytes
- Parsing a string with value exceeding 2^64-1 bytes will return 2^64-1 and an out of range error