|
|
||
|---|---|---|
| .. | ||
| .gitignore | ||
| .travis.yml | ||
| LICENSE | ||
| README.md | ||
| datasize.go | ||
README.md
datasize 
Golang helpers for data sizes
Constants
Just like time package provides time.Second, time.Day constants datasize provides:
datasize.B1 bytedatasize.KB1 kilobytedatasize.MB1 megabytedatasize.GB1 gigabytedatasize.TB1 terabytedatasize.PB1 petabytedatasize.EB1 exabyte
Helpers
Just like time package provides duration.Nanoseconds() uint64 , duration.Hours() float64 helpers datasize has.
ByteSize.Bytes() uint64ByteSize.Kilobytes() float4ByteSize.Megabytes() float64ByteSize.Gigabytes() float64ByteSize.Terabytes() float64ByteSize.Petebytes() float64ByteSize.Exabytes() float64
Warning: see limitations at the end of this document about a possible precission 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.ByteSizeisuint64, so values outside of 0 to 2^64-1 range will overflow - size helper functions (like
ByteSize.Kilobytes()) returnfloat64, which can't represent all possible values ofuint64accurately:- 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
- if the returned value is supposed to have no fraction (ie
- 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