golang学习笔记(进阶篇)

时间:2024-10-11 07:22:02

文章目录

    • 四、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):非操作系统提供而是由用户自行创建和控制的用户态‘线程’,比线程更轻量级。