文章目录
-
- 四、Golang进阶部分(并发)
-
- 4.1 基本概念
-
- 串行、并发与并行
- 进程、线程和协程
- 并发模型
- 4.2 goroutine
-
- go关键字
- 启动单个goroutine
- 启动多个goroutine
- 动态栈
- goroutine调度
- GOMAXPROCS
- 4.3 channel
-
- channel类型
- channel零值
- 初始化channel
- channel操作
-
- 发送
- 接收
- 关闭
- 无缓冲的通道
- 有缓冲的通道
- 多返回值模式
- for range接收值
- 单向通道
- worker pool(goroutine池)
- 总结
- 4.4 select多路复用
- 4.5 通道误用示例
-
- 示例1
- 示例2
- 4.6 并发安全和锁
-
- 互斥锁
- 读写互斥锁
-
- 加载配置文件示例
- 并发安全的单例模式
- 4.7 原子操作
-
- atomic包
- 示例
- 4.8 处理并发错误
-
- recover goroutine中的panic
- errgroup
- 4.9 Go标准库Context包
-
- 为什么需要Context
-
- 基本示例
- 全局变量方式
- 通道方式
- 官方版的方案
- Context初识
- Context接口
-
- Background()和TODO()
- With系列函数
-
- WithCancel
- WithDeadline
- WithTimeout
- WithValue
- 使用Context的注意事项
- 客户端超时取消示例
-
- server端
- client端
- 4.10 Go网络编程
-
- 互联网分层模型
-
- 物理层
- 数据链路层
- 网络层
- 传输层
- 应用层
- socket编程
- socket图解
- Go语言实现TCP通信
-
- TCP协议
- TCP服务端
- TCP客户端
- TCP黏包
-
- 黏包示例
- 为什么会出现粘包
- 解决办法
- Go语言实现UDP通信
-
- UDP协议
- UDP服务端
- UDP客户端
- Go标准库net/http包
-
- HTTP协议
- HTTP客户端
-
- 基本的HTTP/HTTPS请求
- GET请求示例
- 带参数的GET请求示例
- Post请求示例
- 自定义Client
- 自定义Transport
- 服务端
-
- 默认的Server
- 默认的Server示例
- 自定义Server
-
- 4.11 Go单元测试
-
- go test工具
- 测试函数
-
- 测试函数的格式
- 测试函数示例
- 测试组
- 子测试
- 测试覆盖率
- 基准测试
-
- 基准测试函数格式
- 基准测试示例
- 性能比较函数
- 重置时间
- 并行测试
- Setup与TearDown
-
- TestMain
- 子测试的Setup与Teardown
- 示例函数
-
- 示例函数的格式
- 示例函数示例
- 五、Golang数据库部分
-
- 5.1 Go操作MySQL
-
- 连接
-
- 下载依赖
- 使用MySQL驱动
- 初始化连接
- SetMaxOpenConns
- SetMaxIdleConns
- CRUD
-
- 建库建表
- 查询
-
- 单行查询
- 多行查询
- 插入数据
- 更新数据
- 删除数据
- MySQL预处理
-
- 什么是预处理?
- 为什么要预处理?
- Go实现MySQL预处理
- SQL注入问题
- Go实现MySQL事务
-
- 什么是事务?
- 事务的ACID
- 事务相关方法
- 事务示例
- 5.2 sqlx介绍
-
- 安装sqlx
- 基本使用
-
- 连接数据库
- 查询
- 插入、更新和删除
- NamedExec
- NamedQuery
- 事务操作
-
- 的批量插入示例
-
- 表结构
- 结构体
- bindvars(绑定变量)
- 自己拼接语句实现批量插入
- 使用实现批量插入
- 使用NamedExec实现批量插入
- 的查询示例
-
- in查询
- in查询和FIND_IN_SET函数
- 5.3 Go操作Redis
-
- Redis介绍
-
- Redis支持的数据结构
- Redis应用场景
- 准备Redis环境
- go-redis库
-
- 安装
- 连接
-
- 普通连接模式
- TLS连接模式
- Redis Sentinel模式
- Redis Cluster模式
- 基本使用
-
- 执行命令
- 执行任意命令
- 其他示例
-
- zset示例
- 扫描或遍历所有key
-
- 的批量插入示例
-
- 表结构
- 结构体
- bindvars(绑定变量)
- 自己拼接语句实现批量插入
- 使用实现批量插入
- 使用NamedExec实现批量插入
- 的查询示例
-
- in查询
- in查询和FIND_IN_SET函数
- 5.3 Go操作Redis
-
- Redis介绍
-
- Redis支持的数据结构
- Redis应用场景
- 准备Redis环境
- go-redis库
-
- 安装
- 连接
-
- 普通连接模式
- TLS连接模式
- Redis Sentinel模式
- Redis Cluster模式
- 基本使用
-
- 执行命令
- 执行任意命令
- 其他示例
-
- zset示例
- 扫描或遍历所有key
四、Golang进阶部分(并发)
并发编程在当前软件领域是一个非常重要的概念,随着CPU等硬件的发展,我们无一例外的想让我们的程序运行的快一点、再快一点。Go语言在语言层面天生支持并发,充分利用现代CPU的多核优势,这也是Go语言能够大范围流行的一个很重要的原因
4.1 基本概念
首先我们先来了解几个与并发编程相关的基本概念。
串行、并发与并行
串行:我们都是先读小学,小学毕业后再读初中,读完初中再读高中。
并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天)。
并行:同一时刻执行多个任务(你和你朋友都在用微信和女朋友聊天)。
进程、线程和协程
进程(process):程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。
线程(thread):操作系统基于进程开启的轻量级进程,是操作系统调度执行的最小单位。
协程(coroutine):非操作系统提供而是由用户自行创建和控制的用户态‘线程’,比线程更轻量级。