知道各種整形浮點型數字的取值範圍對於節約內存選擇合適的數字類型很有必要。另一方面,有時候需要如JAVA 的Integer.MAX_VALUE那樣獲取某種數字類型的最大(最小)取值,Golang把這些取值封裝在math包作爲常量供開發者調用。
數字類型變量的字節數和取值範圍如下:
- int8 1B -128~127
- int16 2B -32768~32767
- int32 4B -2147483648~2147483647
- int64 8B -9223372036854775808~9223372036854775807
- uint8 1B 0~255
- uint16 2B 0~65535
- uint32 4B 0~4294967295
- uint64 8B 0~18446744073709551615
- float32 4B -3.4028234663852886e+38~3.4028234663852886e+38
- float64 8B -1.7976931348623157e+308~1.7976931348623157e+308
( uint和int在64位機上依次等同於uint64,int64)
- uint 8B 0~18446744073709551615
- int 8B -9223372036854775807~9223372036854775807
獲取取值範圍的代碼如下:
package main
import (
"fmt"
"math"
"unsafe"
)
func main() {
var i8 int8
var i16 int16
var i32 int32
var i64 int64
var ui8 uint8
var ui16 uint16
var ui32 uint32
var ui64 uint64
fmt.Printf("%T %dB %v~%v\n", i8, unsafe.Sizeof(i8), math.MinInt8, math.MaxInt8)
fmt.Printf("%T %dB %v~%v\n", i16, unsafe.Sizeof(i16), math.MinInt16, math.MaxInt16)
fmt.Printf("%T %dB %v~%v\n", i32, unsafe.Sizeof(i32), math.MinInt32, math.MaxInt32)
fmt.Printf("%T %dB %v~%v\n", i64, unsafe.Sizeof(i64), math.MinInt64, math.MaxInt64)
fmt.Printf("%T %dB %v~%v\n", ui8, unsafe.Sizeof(ui8), 0, math.MaxUint8)
fmt.Printf("%T %dB %v~%v\n", ui16, unsafe.Sizeof(ui16), 0, math.MaxUint16)
fmt.Printf("%T %dB %v~%v\n", ui32, unsafe.Sizeof(ui32), 0, math.MaxUint32)
fmt.Printf("%T %dB %v~%v\n", ui64, unsafe.Sizeof(ui64), 0, uint64(math.MaxUint64))
var f32 float32
var f64 float64
fmt.Printf("%T %dB %v~%v\n", f32, unsafe.Sizeof(f32), -math.MaxFloat32, math.MaxFloat32)
fmt.Printf("%T %dB %v~%v\n", f64, unsafe.Sizeof(f64), -math.MaxFloat64, math.MaxFloat64)
var ui uint
ui = uint(math.MaxUint64) //再+1會導致overflows錯誤
fmt.Printf("%T %dB %v~%v\n", ui, unsafe.Sizeof(ui), 0, ui)
var imax, imin int
imax = int(math.MaxInt64) //再+1會導致overflows錯誤
imin = int(math.MinInt64) //再-1會導致overflows錯誤
fmt.Printf("%T %dB %v~%v\n", imax, unsafe.Sizeof(imax), imin, imax)
}