类型

布尔 Boolean

布尔类型,类型标识符 bool,是用于表示布尔真假值集合的类型。真假值使用预定义常量 truefalse 来表示。

注意,truefalse 是预声明的常量标识符,不是典型意义的值,在 buildin.go 中的声明如下:

const (
	true  = 0 == 0 // Untyped bool.
	false = 0 != 0 // Untyped bool.
)
1
2
3
4

零值

布尔型的零值为 false。

支持的运算

逻辑运算

逻辑运算用于衡量两个布尔运算数直接的逻辑关系,结果同样为布尔型。

运算符 operator 说明 演示
&& 逻辑与,conditional AND true && true 为 true,其他情况为 false
|| 逻辑或,conditional OR false || false 为 false,其他情况为 true
! 逻辑非,NOT !true 为 false,!false 为 true

演示:

&& true false
true true false
false false false
|| true false
true true true
false true false
!
true false
false true

比较运算

布尔值仅仅支持是否相等的比较,不支持大小关系比较运算。同为 true 或 同为 false 则相等,否则不相等。

运算符 operator 说明 演示
== 是否等于 true == true //true; true == false // false
!= 是否不等于

整数 Integer

整数类型,用于表示一组整数集合的数据类型。go 语言基于不同位数整数和是否为无符号提供了一系列的预声明整数类型,他们包括:

类型 位数 范围
int8 8,1个字节 (-128 to 127)
int16 16,2个字节 (-32768 to 32767)
int32 32,4个字节 (-2147483648 to 2147483647)
int64 64,8个字节 (-9223372036854775808 to 9223372036854775807)
uint8 8,1个字节 (0 to 255)
uint16 16,2个字节 (0 to 65535)
unit32 32,4个字节 (0 to 4294967295)
unit64 64,8个字节 (0 to 18446744073709551615)
int 平台相关,32或64位,4或8个字节
uint 平台相关,32或64位,4或8个字节

注意:u 开头的表示无符号,不能不能负整数。数字后缀表示位数。没有数字后缀的是基于平台的。

基础概念

  • 位bit:计算机中最基本的计算单位。一个位有两种状态,使用0和1表示。
  • 字节Byte:计算机中最基本的存储单位。一个字节空间较小,通常会有 1KB = 1024B, 1MB = 1024KB,1GB = 1024MB,1TB = 1024GB。1024 = 2^10
  • 1字节 使用 8个位来表示。 1Byte == 8bits

CPU,中央处理器,用于计算,使用位来描述,例如64位或32位。

内存和硬盘,用于存储,使用字节来描述,例如 4GB,256GB。

为啥下载速度远远达不到宽带带宽?

宽带用的是带宽bit位单位,20Mbits/s。

下载软件描述下载速度时,使用的是容量Byte字节单位。

因此最块的速度就是 20/8 MB/s

为什么硬盘的检测容量和给出的容量不一致?

广告中给出的容量的进制为1000,使用10进制1000表示。

而计算机统计时的机制的为1024,使用2^10方计算的。

字面量语法

支持正负数,10、2、8、16进制字面量,为了便于阅读支持下划线分隔符,语法如下:

负号 - 前缀,负数
数字组合,10进制。
0b 或 0B 前缀,2进制,BIN。
0o 或 0O 前缀,8进制,OTC。
0x 或 0X 前缀,16进制,HEX。
数字_数字,下划线分割,便于阅读
1
2
3
4
5
6

演示:

v1 := 42
v2 := 0o42
v3 := 0x42
v4 := 0b10011
v5 := -0b10011
v6 := 1_234_567
fmt.Printf("%T, %v\n", v1, v1) // int, 42
fmt.Printf("%T, %v\n", v2, v2) // int, 34
fmt.Printf("%T, %v\n", v3, v3) // int, 66
fmt.Printf("%T, %v\n", v4, v4) // int, 19
fmt.Printf("%T, %v\n", v5, v5) // int, -19
fmt.Printf("%T, %v\n", v6, v6) // int, 1234567

1
2
3
4
5
6
7
8
9
10
11
12
13

默认类型

整数常量的默认类型为 int,因此类型推导的到的为 int 类型变量。

若需要其他的整型变量,需要使用 var 特别声明,演示:

var v int8 = 42
1

零值

整型的零值为 0。

支持的运算

算术运算

运算符 operator 说明 演示
+ 3+5 = 8
- 3-5 = -2
* 3 * 5 = 15
/ 整除,结果也是整数 5 / 3 = 1
% 取余 5%3 = 2,若有负数参与运算,则余数的符号与被除数一致

演示:

fmt.Println(5/3, -5/3, 5/-3, -5/-3)
fmt.Println(5%3, -5%3, 5%-3, -5%-3)
// 结果
1 -1 -1 1
2 -2 2 -2

1
2
3
4
5
6

递增、递减

运算符 operator 说明 演示
++ 递增 v := 42; v ++ // 43
-- 递减 v := 42; v -- // 41

演示:

v1 := 42
v1 ++
fmt.Println(v1) // 43
v2 := 42
v2 --
fmt.Println(v2) // 41
1
2
3
4
5
6

注意,++,-- 运算符构成独立语句,而不构成表达式,因此不能直接将++或--的结果当做一个值去使用,需要独立运算完毕,再使用变量的递增递减值,演示:

错误的语法:

v1 := 42
fmt.Println(v1++) //: syntax error: unexpected ++, expecting comma or )
1
2

正确的语法:

v1 := 42
v1 ++ // 独立为一条语句
fmt.Println(v1) // 43
1
2
3

关系运算

整数类型支持全部的关系运算符。

运算符 operator 说明 演示
> 是否大于 12 > 8 // true; 12 > 15 // false
< 是否小于
== 是否等于 12 == 8 // false;
>= 是否大于或等于 12 >= 8 // true; 12>=12 // true; 12 >= 14 // false
<= 是否小于或等于
!= 是否不等于 12 != 8 // true

位运算

支持的运算符有:

运算符 operator 说明 演示
& 位与,bitwise AND
| 位或,bitwise OR
^ 位异或,bitwise XOR
&^ 位与非,bit clear (AND NOT)
<< 位左移,left shift
>> 位右移,right shift

存储机制

在计算机系统中,数值采用补码来表示和存储。其优势在于:

  • 符号位和数值为可以统一处理。
  • 加法和减法可以统一操作操作。
  • 补码、反码、原码之间的转换容易。

计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示正,用1表示负。

  • 原码,符号位加上值绝对值。
  • 反码,原码符号位不变,数值为取反。
  • 补码,反码+1.
  • 正数的原码、反码、补码保持一致。

演示:

值 42 的原码,我们采用 32 bit 的描述:

正数,符号位为0。

数值位为42的二进制是:101010

正数的,反码,补码与原码一致:

转成二进制:101010,正数的补码与原码一致

00000000 00000000 00000000 00101010
1

值 -42 的原码,我们采用 32 bit 的描述:

负数,符号位为1。

数值位为42的二进制是:101010。

原码:

1 0000000 00000000 00000000 00101010
1

反码:除符号位外,数值位取反,0变1,1变0.

1 1111111 11111111 11111111 11010101
1

补码:反码+1

1 1111111 11111111 11111111 11010110
1

进制说明

  • 10进制:逢十进一,自然人来使用。使用 [0123456789] 表示每个值。
  • 2进制:逢二进一,计算机的进位方式。使用 [01] 表示每个值。
  • 8进制,2^3=8, 采用3个位表示一个数位。使用 [01234567] 表示值
  • 16进制,2^4=16可以采用4个位表示一个数位。使用 [0123456789ABCDEF] 表示值

不同的进制,表示同一个数的写法是不同的:

表示 42:

  • 10:42
  • 2:0b10 1010
  • 8:0o52
  • 16:0x2A

如何将其他进制转换10进制:

算法:每一位上的数值乘以进制的权重次幂,累加求和。权重,从低位到高位(从右到左)累加1,最低位为0.

0o52 对应的10进制为多少呢?

// 0o52
//   10	权
// 5*8^1 + 2*8^0
//=40 + 1
//=42

// 0b101010
//   543210		权
// 1*2^5 + 0 + 1*2^3 + 0 + 1*2^1 + 0
// 32 + 8 + 2
// 42

// 0x2A
// 2*16^1 + A*16^0
// 32 + 10*1 // A==10
// 42
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

如何将十进制转为2进制?可以手动计算完成,位运算需要该计算!

算法:除2取余,余数倒序罗列,迭代执行,直到整除结果为0.

42转为2进制是多少?

//	42	余
//	 2
//-----		^
//	21	0	|
// 	 2
//-----		^
//	10	1	|
// 	 2
//-----		^
//	 5	0	|
//   2
//-----		^
//   2 	1	|
//   2
//-----		^
//   1	0	|
// 	 2
//-----		^
//	 0	1	|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

浮点数 float

字符串 string

数组 array

切片 slice

映射表 map

结构体 struct

指针 pointer

功能类型

函数 function

信道 channel

接口 interface

类型声明

类型别名

类型定义