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到同级或上级作用域