数据类型
动态类型编程语言
- 在运行时进行判断大小
静态类型的编程语言: Go, C ...
- 需要给一些定义的变量赋值空间大小
基本数据类型 (有默认值)
布尔类型
取值只有 true 和 false
数字型 int
每个数字有限定大小的。(受底层硬件制约, 数据都是由长度限制的 ->数据宽度, 若超过 会丢弃超过部分的数据) 若超过, 执行时会报错 (如无符号整数只能表示 >0 的整形数, 常用于表示内存地址)
在计算机底层是以 二进制补码的形式存储
1 | uint8 无符号8位整型 (0~255) |
2 | uint16 无符号16位整型 (0~226) |
3 | uint32 无符号32位整型 |
4 | uint64 无符号64位整型 |
5 | int8 有符号8位整型 (-128~127) |
6 | int16 有符号16位整型 (-216-1~216-1) |
7 | int32 有符号32位整型 |
8 | int64 有符号64位整型 |
浮点型 float
float32 float64 默认的float类型 是保存6位小数
若符合IEEE754标准的话 float32的32位是这样安排的
1位数符(表示正负) s 7位为阶码 c 23位为尾数 q (阶码决定数浮点数的大小, 尾数决定浮点数的精度 -> 可能会丢失, 造成精度损失) (b为基数 一般为2)
而float64(就是double, Go 默认使用float64) 则以 1位数符 10位阶码 54位尾数 分布
IEEE754 浮点数标准,这个标准统一了浮点数的表示形式,并提供了 2 种浮点格式:
- 单精度浮点数 float:32 位,符号位 S 占 1 bit,指数 E 占 8 bit,尾数 M 占 23 bit
- 双精度浮点数 float:64 位,符号位 S 占 1 bit,指数 E 占 11 bit,尾数 M 占 52 bit
package main
import "fmt"
func main() {
var f1 float64 // 默认的float类型, 都是保留6位小数
f1 = 3.1600002
var f2 float32
f2 = 5
fmt.Println(f1) // 若直接输出是会输出全部 即 3.1400002
// 格式化输出(浮点数) %f 若想保留x位小数 则以 %.xf 来~
fmt.Printf("%T,%.1f\n", f1, f1) // float64,3.2 若小于当前保留的位数, 则是四舍五入
fmt.Printf("%T,%f\n", f2, f2)
}
特殊的数字类型
byte = uint8 (别名) 一个字节
rune = int32
字符串类型 string
字符串为一串固定长度的字符连接起来的字符序列 (编码 -> 字符)
Go语言, 所有字符串是由单个字符连接起来 UTF-8 (目前兼容我们绝大部分的文字, 符号)
GBK编码 (号称兼容所有的中文汉字)
Unicode编码 (号称兼容全世界的文字) (编码 实质上是数字的映射)
func main() {
// 单引号是字符, 本质是整型数 (ASCII码映射)
c1 := 'a'
c2 := "a" // 双引号是string类型, 本质是字符 Go的字符串是由单个字符连接起来
// 先是输出对应变量的类型, 然后输出变量的值
fmt.Printf("%T,%d\n", c1, c1) // int32,97
fmt.Printf("%T,%s\n", c2, c2) // string,a
}
转义字符
转义字符 | 意义 | ASCII码值 (十进制) |
---|---|---|
\a | 响铃 | 007 |
\b | 退格, 将当前位置移到前一列 | 008 |
\f | 换页, 将当前位置移到下页开头 | 012 |
\n | 换行, 将当前位置移向下一行开头 | 010 |
\r | 回车 | 013 |
\t | 水平制表 (相当于一个tab键) | 009 |
\v | 垂直制表 | 011 |
\ | 代表一个反斜线字符 '' | 092 |
' | 代表一个单引号字符 | 039 |
? | 代表一个问号 | 063 |
\0 | 空字符(NULL) | 000 |
数据类型的转换
在必要的情况下, 一个类型的值转换成另一个类型的值 (显式声明)
package main
import "fmt"
func main() {
// 浮点数转整数, 会截断小数部分, 只保留整数部分
a := 5.9 // float
b := int(a) // b 就是int类型的 a = 5
fmt.Printf("%T,%.1f\n", a, a)
fmt.Printf("%T,%d\n", b, b)
c := 1
d := float64(c)
fmt.Printf("%T,%d\n", c, c)
fmt.Printf("%T,%f\n", d, d)
// 布尔类型转换 不能转换为其他数据类型
}
算术运算符
+ - * / %
二元运算符
7/2 = 3, 7%2 = 1
++ --
一元运算符
关系运算符
大于 >
小于 <
等于 ==
不等于 !=
大于等于 >=
小于等于 <=
运算返回结果: true/false
逻辑运算符
用于判断多个条件的时候会用到
逻辑与 &&
只有所有条件为真 返回结果才为真 -> 短路原则: 从左到右开始判断, 当出现假的时候, 后面的不需要再判断了, 直接返回 false (故将容易出错的条件前置)
逻辑或 ||
只要有一个条件为真 返回结果即为真
取非 !
将当前结果的bool值取反
位运算符
是基于数的二进制来进行的
按位与 &
0&1 = 0 0&0=0 1&1=1
按位或 |
0|0 = 0 0|1 = 1 1|1 = 1
若是一个数与另一个数做位运算, 需要将那两个数字 以二进制的形式展开, 然后再按位操作
>>
二进制数向右移动 (算数移位 考虑符号位~) (相当于乘2)
<<
二进制数向左移动 (算数移位) (相当于除2)
^
按位异或 对应位上二进制数相同返回0, 不同的话返回1
&^
位清空 a&^b 对于b上每个数值, 如果为0,则取a对应位上的数值。如果b的为1, 则取0
package main
import "fmt"
func main() {
var a int8
a = 127 // 二进制表示 01111111
a <<= 1 // a左移一位 11111110 -> -2 第一位为符号位 且以补码的形式解读 故此时 a = -2
fmt.Println(a)
var b int8
b = -128 // 二进制表示 10000000
b >>= 1 // b右移一位 11000000 -> -64 说明是算数移位
fmt.Println(b)
var c int8
c = -128 // 10000000
c <<= 1 // 负数 补码的算数移位 规则 左0右1 即左移的话补0, 右移补1 所以移完后c的二进制为 00000000
fmt.Println(c) // 0
}
赋值运算符
运算符 | 描述 |
---|---|
= | 赋值运算符, 将一个表达式的值赋给左边的变量 |
+= | 相加后赋值 |
-= | 相减后赋值 |
*= | 相乘后赋值 |
/= | 相除后赋值 |
%= | 求余后赋值 |
<<= | 左移后赋值 |
>>= | 右移后赋值 |
&= | 按位与后赋值 |
^= | 按位异或后赋值 |
/= | 按位或后赋值 |
其他运算符
特殊用法的运算符
运算符 | 描述 | 实例 |
---|---|---|
& | 描述变量存储地址 | &a; 将给出变量的实际地址 |
* | 指针变量 | *a; 是一个指针变量 |