Go 基本数据类型

58 阅读5分钟

数据类型

动态类型编程语言

  • 在运行时进行判断大小

静态类型的编程语言: Go, C ...

  • 需要给一些定义的变量赋值空间大小

基本数据类型 (有默认值)

布尔类型

取值只有 true 和 false

数字型 int

每个数字有限定大小的。(受底层硬件制约, 数据都是由长度限制的 ->数据宽度, 若超过 会丢弃超过部分的数据) 若超过, 执行时会报错 (如无符号整数只能表示 >0 的整形数, 常用于表示内存地址)

在计算机底层是以 二进制补码的形式存储

1uint8 无符号8位整型 (0~255)
2uint16 无符号16位整型 (0~226)
3uint32 无符号32位整型
4uint64 无符号64位整型
5int8 有符号8位整型 (-128~127)
6int16 有符号16位整型 (-216-1~216-1)
7int32 有符号32位整型
8int64 有符号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; 是一个指针变量