Go基础知识
1.1 语言简介
Go: 解决并发支持不友好、编译速度慢、编程复杂这三个问题
1.2 初识 Go 程序 & 1.3 Go词法单元
token是原子单元,分为三类:标识符、操作符和分隔符、字面常量
标识符
A. 预声明标识符(65个)
25 个关键字,分为:
引导程序整体结构的 8 个关键字(package, import, const, var, func, defer, go, return)
声明复合结构的 4 个关键字(struct, interface, map, chan)
控制程序结构的 13 个关键字
20 个内置数据类型标识符,分为:
数值 16 个(整型 12 个,浮点型 2 个,复数型 2 个),字符和字符串型 2 个,接口型 1 个,布尔型 1 个
词法解析:
15 个内置函数,具有全局可见性(make, new, cap, append, copy, delete, panic, recover, close, complex, real, image, print, println)
4 个常量值标识符(true, false, iota, nil)
1 个空白标识符(_)
B. 用户自定义标识符
包名、变量名、常量名、函数名、自定义类型名、方法名
操作符和分隔符
4 个纯粹分隔符:空格、制表符、回车、换行
47 个操作符:分为:
5 个算术运算符:加减乘除模
6 个位运算符:& | ^ &^ >> <<
13 个赋值和赋值复核运算符
6 个比较运算符
6 个括号
3 个逻辑运算符(&& || !)
2 个自增自减操作符 (++ – Go中自增自减是语句)
6 个其他运算符(: ; , . … <-)
字面常量
编程语言源程序中表示固定值的符号叫做字面常量(字面量),只能表达基本类型的值
用于常量和变量的初始化,和表达式里作为函数调用实参
分为 5 类:
整型字面量
浮点型字面量
复数类型字面量
字符型字面量(’’)
字符串字面量(””)
1.4 变量和常量
通过自定义标识符绑定一块特定的内存,把对地址的操作和引用变为对变量的操作,这是编程领域的巨大进步
变量
该内存地址中存放的数据类型由定义变量时指定的类型决定,变量指向的内存内容可以被修改
声明:
var name dataType = value (value不指定默认该类型零值)
name := value (只能在函数内,自动类型推断)
Go的自动内存管理中的编译器栈逃逸技术能够自动为变量分配空间,可能在栈上也可能在堆上
常量
该内存地址中存放的数据类型由定义常量时指定的类型决定,常量指向的内存不能被修改,存储在只读段。分为布尔型、字符串型、数值型
iota用在常量声明中,其初始值为0,可以看作自增的枚举常量
1.5 基本数据类型
Go是一种强类型的静态编译语言,类型是高级语言的基础
7 种基本数据类型,20 个具体子类型
布尔型:bool
不指定初始值默认false
整型:byte, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr
byte是uint8的别名,不同类型需要强转
浮点型:float32, float64
字面量自动推断为float64,两个浮点数不应该使用==或!=进行比较,因为计算机很难进行浮点数的精确表示和存储,使用math标准库
复数:complex64, complex128
complex64由2个float32构成,complex128由2个float64构成
var v = complex(2.1, 3)
字符:rune
rune是表示Unicode编码的字符,内部是int32的别名,占用4个字节
此外,byte字节类类型,内部是uint8的别名,也是字符类型
字符串:string
常量,可以通过类似数组的索引访问字节单元,但是不能修改
[]byte() 字符串转切片要慎用,因为没转换一次都要复制内容
底层实现是一个二元的存储结构,一个指向字节数组的起点,一个是长度
基于其的切片操作返回的是string,而非slice
错误类型:error
1.6 复合数据类型
由其他类型组合而成的类型
指针
出现在等号左边表示指针声明,右边表示取指针指向的值
不支持运算,因为会影响垃圾回收
允许返回局部变量地址(栈逃逸分配到堆)
数组
通过字面量初始化
切片
三要素:指向底层数组的指针、切片的元素数量、底层数组的容量
支持通过数组创建和通过内置函数make创建
map
支持字面量创建和通过内置函数make创建
不要直接修改map内摸个元素内部的值,如果要修改必须整体赋值
delete(mapName, key)
len()返回键值对数量
struct
可以存储任意类型,存储空间连续
p := &Person {
Name: “ ”,
Age: “ ”,
}
1.7 控制结构
程序执行本质上就两种模式:顺序和跳转
if 语句
尽量减少条件语句的复杂度,太复杂考虑封装
尽量减少if的嵌套层次,通过重构让代码扁平易读
switch 语句
default(所有分支都不符合,可以在任意位置), fallthrough(强制执行下一个case)
for 语句
三种C-like写法,for, while,和死循环
可以遍历map、数组、切片、字符串、通道
标签和跳转
Label
和 break,continue搭配使用,跳到label标注的位置执行,break直接跳出迭代,continue执行下一个迭代
goto
不能越过声明语句,goto到同级或上级作用域