Go语言学习笔记02 — 内置基本类型之数值与布尔类型
在 Golang 中数据分为内置的基本类型和聚合类型。而内置的基本类型又分为数值、布尔类型、字符串。今天的这篇文章的重点介绍的就是数字和布尔。另外最后按照惯例,做一道相关的算法题。
一、数值类型
(一)、整数
按照位数划分,Go 中又提供了 11 种内置的整数类型:int8、uint8、int16、uint16、int32、uint32、int64、uint64、int、uint 以及 uintptr。
其中以 u 开头表示的是无符号数,如 uint8、uint16、uint32、uint64、uint、uintptr,其他五种则是有符号数。有符号和无符号的区别在于有符号数会将左边的第一位用于表示正负号,第一位 0 表示是正数,1 表示为负数。
后面的数字表示该类型的值在内存中所占有的二进制位个数,也就是我们所说的比特(bit),8 表示有 8bit,所以对于 int8 类型而言,最大值是 127(2^7 -1),最小值是-128(-2^7),而 uint8 的最小值是 0,最大值是 256。
此外 Go 中为 int8 和 int32 又分别设置了别名,分别为 byte 和 rune,至于为什么要设置这样的别名,其实和字符串还有关系,所以我们暂且按下不表。
int、uint 和 uintptr 比较特殊,它们所占的位数依赖具体的编译器,通常在 64 位的架构上,int 和 uint 类型的值是 64 位,32 位架构上是 32 位。而编译器会保证 uintptr 的值的尺寸能够存下任意一个内存地址。
(二)、浮点数
Go 中内置了两种浮点数类型 float32 和 float64,浮点数即我们日常中经常聊的小数,其中 float32 的精度相对较低,有效数字是 6 位(即小数点后 6 位),而 float64 类型的有效数字是 15 位。
在 Go 提供的 math 标准包中,可以通过 math.MaxFloat32 和 math.MaxFloat64 来获得 float32 和 float64 对应的最大值。
(三)、复数
Go 中内置了两种复数类型:complex64 和 complex128,因为一个复数分为实部和虚部,所以 complex64 指的是实部和虚部都是 float32 类型,complex128 的实部和虚部都是 float64 类型。
Go 中也提供了内置的两个函数 real() 和 imag() 来提取复数的实部和虚部
(四)、零值
对于每一个数值类型,其零值都为零,只是在内存中,不同类型的零所占用的空间也不尽相同。复数的零值是 0.0+0.0i,也可以用 0i、.0i、0+0i 这样的格式
二、布尔类型
一个布尔值表示一个真假,在内存中只有两种可能的状态之一,使用内置的常量 true 和 false 来表示。
对于布尔类型而言,其零值是 false
三、字面量表示形式
一个值的字面形式称之为一个字面量,它表示此值在代码中文字体现的形式。
布尔类型
一般将 内置的 true 和 false 当作布尔类型的字面量
整数类型
整数类型值有四种字面量形式:二进制、八进制、十进制和十六进制示例:
0x9F //十六进制表示的字面量(必须以0x或者0X开头)
0X9F
0237 //八进制表示的字面量(必须以0、0o或者0O开头)
0o237
0O237
0b10011111 //二进制表示(必须以0b或者0B开头)
0B10011111
159 //十进制表示(必须不能以0开头)
浮点型
一个浮点数的完整十进制字面量形式会包含以下几个部分: 十进制整数部分、小数点、一个十进制小数部分以及一个以 10 为底的整数指数部分(一般用 e 或者 E 来指代底数,后面跟的数字表示指数,xEn 表示 x 乘以 10^n 的意思,xE-n 表示 x 除以 10^n 的意思)
1.23
.23
1.
1.23e2 // 123.0
123.E-2 // 1.23
此外从 Go 1.13 开始,Go 也支持另外一种浮点数字面量形式:十六进制浮点数字面量。
一个十六进制浮点数字面量必须以 0x 或者 0X 开头,可以只包含小数点和一个十六进制小数部分一个十六进制浮点数字面量必须有一个以 2 为底数的整数指数部分。由字母 p 或者 P 带一个十进制的整数组成(如 yPn 表示 y 乘以 2^n 的意思,yP-n 表示 y 除以 2^n 的意思)
0x1p-2 // => 1/2^2 = 0.25
0x2.p10 // => 2.0*2^10 = 2048.0
0x.8P1 // => 8/16 * 2^1 = 1.0
复数字面量
复数分为实部和虚部,实部就是正常的浮点数字面量,而虚部的字面量形式是一个浮点数字加上一个小写的字母 i 组成
1 + 2i // == 1.0 + 2.0i
1.23i - 7.81 // == -7.81 + 1.23i
1.23i // == 0.0 + 1.23i
可读性
对于一些长度很长的数值,为了增强可读性,从 Go1.13 版本开始,可以在整数、浮点数、复数的虚部字面量中,使用下划线 _ 作为分段符,不过有两个规则:
- 在一个数值字面表示中,一个下划线 _ 不能出现在此字面表示的首和尾
- 下划线 _ 两侧的字符必须为同一进制的数字字符或者是进制表示头(如 0o、0O、0x、0X、0b 等)
012_345_678 // ==012345678
0x_1EC_356 // == 0x1EC356
//以下示例是非法的
_69
69_
1_.23
1._23
0_b10110101
四、每日一题
题目:231. 2 的幂描述:给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
思路
思路一设定初始值 temp=1, 利用 for 循环,每次将 temp 向左移一位,也就是每一次循环乘以 2,和入参 n 比较大小,相等则返回 true,最终大于入参 n 则返回 false
func IsPowerOfTwo(n int) bool {
for temp := 1; temp <= n; temp = temp << 1 {
if temp == n {
return true
}
}
return false
}
时间复杂度: O(logn)
思路二加入 n 是 2 的幂,那么从占位上看,肯定有一位是 1,其余全是 0,比如说 8,对应的二进制是 1000,而 7 的二进制表示是 0111, 两者作位与运算,结果一定为 0。所以只要一行代码
func isPowerOfTwo(n int) bool {
return n > 0 && (n&(n-1)) == 0
}
时间复杂度: O(1)
END
转载请注明:XAMPP中文组官网 » Go语言学习笔记02:内置基本类型之数值与布尔类型