在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 当作布尔类型的字面量

整数类型

整数类型值有四种字面量形式:二进制、八进制、十进制和十六进制 示例:

浮点型

一个浮点数的完整十进制字面量形式会包含以下几个部分: 十进制整数部分、小数点、一个十进制小数部分以及一个以10为底的整数指数部分(一般用e或者E来指代底数,后面跟的数字表示指数,xEn 表示x乘以10^n 的意思,xE-n表示x除以10^n的意思)

此外从Go 1.13开始,Go也支持另外一种浮点数字面量形式:十六进制浮点数字面量。

一个十六进制浮点数字面量必须以0x或者0X开头,可以只包含小数点和一个十六进制小数部分 一个十六进制浮点数字面量必须有一个以2为底数的整数指数部分。由字母p或者P带一个十进制的整数组成(如yPn 表示 y乘以2^n的意思,yP-n 表示 y 除以 2^n 的意思)

复数字面量

复数分为实部和虚部,实部就是正常的浮点数字面量,而虚部的字面量形式是一个浮点数字加上一个小写的字母i 组成

可读性

对于一些长度很长的数值,为了增强可读性,从 Go1.13版本开始,可以在整数、浮点数、复数的虚部字面量中,使用下划线 _ 作为分段符,不过有两个规则: 1. 在一个数值字面表示中,一个下划线 _ 不能出现在此字面表示的首和尾 2. 下划线 _ 两侧的字符必须为同一进制的数字字符或者是进制表示头(如0o、0O、0x、0X、0b等)

四、每日一题

题目:231. 2 的幂 描述:给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。

思路

思路一 设定初始值temp=1, 利用for循环,每次将temp向左移一位,也就是每一次循环乘以2,和入参n比较大小,相等则返回true,最终大于入参n则返回false

时间复杂度: O(logn)

思路二 加入 n 是2的幂,那么从占位上看,肯定有一位是1,其余全是0,比如说8,对应的二进制是 1000,而7的二进制表示是 0111, 两者作位与运算,结果一定为0。所以只要一行代码

时间复杂度: O(1)