Go基础数据类型及运算
数据类型分类
- 命名类型
- 基础数据类型(整型、浮点型等)
- 用户自定义类型(type关键字定义的结构、接口等)
- 未命名类型
- 集合类型(数组、切片、映射等)
- 函数等
可以用reflect.TypeOf函数来查看类型名称
基础数据类型
整型
有符号位:int int8 int16 int32 int64
无符号位:uint uint8 uint16 uint32 uint64 uintptr
不同的整型之间不能直接比较,不能直接运算
- uintptr
- 记录具体的内存地址,不是指针
- 地址关联的对象可以被垃圾回收,值不会连带着变动
- 可以做数值运算,用来跳跃到指定地址
浮点型
包括float32 (±3.4×1038)和float64(±1.8×10308 )
复数
布尔型
布尔值包括true、false,类型长度为1字节
布尔类型无法被其他类型赋值,也不支持类型转换
布尔类型不支持用0和1表示真假
if 和for 语句的条件部分必须是布尔类型的值或表达式
字符型
字符常量用单引号,如’中’,’1’
使用转义字符 ‘’ 转变为特殊字符常量,如’\n’
字符按整数处理,可以运算
格式化输出时,可用%c 输出对应码点值,如
//浙
fmt.Printf(“%c”, 27993)
字符集的主要属性
- 字符
- 码点(code point),字符在该集合的唯一数字序号
- 位模式(bit pattern) ,码点的二进制比特串
编码:码点→位模式
解码:位模式→码点(从字符集取出对应字符)
乱码:匹配的字符集不正确,相同的位模式在不同的字符集中对应的是不同的字符,产生解码错误
Unicode字符集将世界上存在的绝大多数常用字符进行统一编号,解决了码点不统一问题
UTF-32、UTF-16 编解码简单,所有字符用4个或2个字节表示,但存在大小端的字节序、不兼容ASCII字符集、空间效率低等问题
UTF-8采用变长度(1~4)字节进行编码,码点小的字节数少,码点大的字节数多,前128个码点与ASCII重合,并且没有字节序问题,已成为Unicode 编码的事实上标准。
字符串型
字符串单行用双引号 ,多行可用反引号`,空格和缩进都会被保留
字符串是引用类型
字符串长度查询是O(1)
字符串零值可用
字符串不可修改
用strings.Builder , bytes.Buffer 来提高字符拼接效率
指针(重要)
取地址符&,间接访问符*
- 指针指向存放数据的地址,指针可以操作两个实体
- 指针值(数据地址)
- 间访值(数据本身)
- 指针必须赋值(指向了数据)后,才能进行间接访问操作
- GO支持指针的指针
- 指针只声明未赋值时的零值为nil
a := 5
var b *int //指针声明,此处 * 在类型前,为指针声明符
fmt.Print(b == nil) //true
b = &a //指针赋值
*b = 6 //指针间访,此处 * 在变量前,为间访操作符
//b++ //报错,GO支持垃圾回收,禁止指针运算
var c **int //指针的指针
c = &b
**c = 7
运算符
++ 自增 只能 变量++ ,++变量不支持
– 自减 只能 变量-- , --变量不支持
位运算:
位运算符只对整数起作用,直接处理每一个比特位(bit),是底层运算,效率较高
- 左移操作<<:将整数最高位挤掉(符号位不变),在右端补0,相当于乘以2的指定次方
- 右移操作>>:在整数的高位挤一个符号位,而整数最低位被挤掉
- 位与操作& :将两个操作数每一位做与操作
- 位或操作 | :将两个操作数每一位做或操作
- 异或运算 ^ :将两个操作数每一位做异或(不同返回1,相同返回0)操作