一、布尔值
Go语言中的布尔值有两个,一个是true一个是false。
二、数值类型
1、基础
每一个数值类型都不同,这意味着我们不能在不同的类型之见进行二进制数值运算或者比较操作。无类型的数值常量可以兼容表达式中任何类型的数值,因此我们可以直接将一个无类型的数值常量与另一个数值做加法,或进行比较。
代码举例说明
func main() {
a := int32(1)
b := int64(2)
c = a + b //错误!类型不同,不能进行二进制运算
if a < b { //错误! 类型不同,不能进比较
//todo
}
}
什么是无类型数值常量?
定义方法
const d = 1 这样d就可以跟a或b进行运算或比较。
2、数值间类型转换
如果我们需要在不同的数值类型之见进行数值运源或者比较操作,就必须进行数值转换。类型转换采用type(value)形式,只要合法就能转换成功——即使会导致数据丢失。请看下面的例子。
func main() {
a := int32(1)
b := int64(2)
c := int32(b) //把变量b转换为int32类型,并复制给c
fmt.Println(a+c)
}
如果大的类型转换为小的类型,可能会导致数据丢失。转化前最好先进行判断。
判断方法,引入math包,用math.MaxUit8、math.MaxUit64…进行最大值判断。
3、整型
Go语言提供了11种类型,包括5种有符合和5种无符号,再加上1种用于存储指针的整形类型。他们的名字和值在下方给出。
类型 | 取值范围 | |
---|---|---|
byte | 等同于uint8 | |
int | 依赖于不同平台的实现,可以是int32或者int64 | |
int8 | [-128~127] | |
int16 | [32768~32767] | |
int32 | [-2147483648~2147483647] | |
int64 | [-922337203685477588~9223372036854775807] | |
rune | 等同于uint32 | |
uint | 依赖于不同平台的实现,可以是uint32或者uint64 | |
uint8 | [0~255] | |
uint16 | [0~65535] | |
uint32 | [0~4294967295] | |
uint64 | [0~18446744073709551615] | |
uintptr | 一个可以恰好容纳指针的无符号整形类型 |
4、浮点类型
Go语言提供了两种类型的浮点类型和两种类型的复数类型。
类型 | 取值范围 | |
---|---|---|
float32 | +-3.402823466*10的38次方 | |
float64 | +-1.797693134*10的308次方 | |
complex64 | 实部和虚部都是float32 | |
complex128 | 实部和虚部都是float64 |
浮点数的比较
因为浮点数不是一种精确的表达方式,所以不能像整形直接用 == 来判断连个浮点数是否相等,这可能会造成不稳定的结果。
下面给出一个解决方案。
func EqualFloat(x,y,limit float64) bool {
if limit <= 0.0 {
limit = math.SmallestNonzeroFloat64
}
return math.Abs(x-y) <= (limit * math.Min(math.Abs(x),math.Abs(y)))
}
此函数用于再给定范围内比较两个float64类型数,如果给定的精度范围为负数,则该精度设为机器所能达到的最大精度。
最后介绍一些Go语言math包中的常用函数。
除非特殊说明,math包中所用的函数都接受并且返回float64数据。
语法 | 含义/结果 | |
---|---|---|
math.Abs(X) | X的绝对值 | |
math.Ceil(X) | >=X的最小整数,math.Ceil(5.6) == 6.0 | |
math.Floor(X) | <=X的最大整数,math.Floor(5.6) == 5.0 | |
math.Max(X,Y) | X,Y中的大者 | |
math.Min(X,Y) | X,Y中的小者 | |
math.Mod(X,Y) | X除Y的余数 |