本书主要从初识go语言、go语言基本语法和使用、容器:存储和组织数据的方式、流程控制、函数、结构体、接口、包、并发、反射、编译与工具、避坑与技巧、实战演练(剖析cellent的网络库设计并实现socket聊天功能)
 书籍封面
 
初识go语言
 接收和发送封包
 go语言的基本语法和使用
 容器:存储和组织数据的方式
 概念
 我们在编写一些复杂的算法、结构和逻辑,需要更复杂的类型来实现,这种复杂的类型一般都有各种形式的存储和处理数据的能力,将他们称之为容器
 其他语言对容器支持与否
 C语言没有提供容器封装,可以使用第三方
 C++的容器标准库提供
 vector对应数组
 list对应双链表
 map对应映射
 C#通过.NET的框架提供
 List对应数组
 Linked List 对应双链表
 Ditrionary对应映射
 lua语言table实现的数组和映射,没有双链表支持
 分类
 数组
 概念:固定大小连续的空间
 var arr […] string {“hello”,“world”,“nihao”} 生命数组,… 自动填3。
 切片slice
 概念:动态分配大小连续的空间
 地址、大小,容量
 从数组到切片生成新的切片
 slice[开始位置:结束位置]
 切出来的不包括结束索引
 如果要切到最后一个元素 slice[len(slice)]
 从指定范围生成切片
 slice[10:15] slice[10]到slice[14]
 slice[20:] slice[20]到最后
 slice[:2] 从头到slice[1]
 slice[:] 表示原有切片
 重置切片:清除拥有元素
 slice[0:0]
 声明切片
 var slice []type
 构造切片
 make([]type,2)
 make([]type,2,10)
 切片添加元素append()
 复制切片元素copy
 删除元素 slice=append(slice[:5],slice[7:]…)
 映射map
 概念:建立事物关联的容器。在业务和算法中需要使用任意类型的关林关系时,就需要用到映射
 映射关联容器使用到的两种算法
 散列表
 散列表查找的复杂度时O(1)到O(n)
 扩容时,需要重新把数据放到新地址
 平衡树
 类似于父子关系的一棵树,每次放入树时都要与一些节点进行比较
 复杂度始终位O(log n)
 删除delect()
 清空make一个新的
 并发的sync.Map
 没有提供计算大小的方法
 添加函数 .Store(k,v)
 查找 .Load(k)
 删除 .Delete(k)
 列表list
 概念:可以快速的增删非连续空间的容器
 分类
 单链表
 双链表
 初始化链表
 New
 mylist := list.New()
 声明
 var mylist list.List
 流程控制
 函数
 分类
 普通函数
 匿名函数
 闭包
 声明函数
 带有变量名的返回值
 把函数作为值保存到变量中
 字符串链式处理—操作与数据分离的设计技巧
 概念 : mysql的操作,获取数据,对原始数据进行排序、分组、去重等操作。数据的操作和遍历过程。
 匿名函数—没有函数名字的函数
 函数类型实现接口----把函数作为接口来调用
 结构体实现接口
 函数实现接口
 闭包----引用外部变量的匿名函数
 在闭包内部修改引用的变量
 闭包中俘获的变量会和闭包的生命周期一样
 闭包记忆效应
 闭包实现生成器
 可变参数—参数数量不固定的函数
 延迟执行语句defer
 按照defer顺序,逆序执行。
 使用延迟执行语句,在函数退出时释放资源
 使用延迟是释放并发锁
 使用延迟释放文件句柄
 处理运行时发生的错误
 net包中例子
 net.Dial() socket连接函数
 错误接口定义格式
 type error interface{ Error() string }
 自定义一个错误
 errors.New(“this is error”)
 errors包
 在代码中使用错误定义
 在解析中使用自定义错误
 go语言中三个模式
 defer
 panic
 recover
 宕机(panic)—程序终止运行
 恢复方法
 配合defer和recover配合实现错误捕捉和恢复
 手动触发宕机
 在运行依赖必备资源缺失,主动出发宕机
 在宕机是触发延时执行语句
 宕机恢复(recover)----防止程序崩溃
 让程序在崩溃时继续执行
 panic和recover的关系
 结构体
 接口
 包
 并发
 概念:指同一时间内执行多个任务。
 含义广泛:包括多线程、多进程、以及分布式程序
 轻量级线程
 调整并发运行性能
 runtime.GOMAXPROCS()
 理解并发和并行
 同一时刻只做一件事并发
 同一时刻做多件事是并行
 go语言的协作程序
 go语言的协作程序
 并行执行
 无法控制自己获得最高优先度支持
 抢占式
 普通的协作程序
 始终是顺序执行
 始终发生在单线程,只有交出控制权,宿主才能获得控制权
 协作式
 通道
 使用通讯方法代替共享内存
 协程之间数据交互
 特殊类型:同时只能有一个协程访问通道进行发送和接受
 声明通道
 创建通道
 通道发送将持续被阻塞,直到数据被接受
 使用通道接受数据
 通道的收发必须在两个协程里
 接收数据直到,发送完成才会继续执行
 每次接收一个元素
 阻塞接受数据
 非阻塞接受数据
 接收任意数据,忽略接收的数据
 循环接收
 并发打印
 单通道
 time的单向通道
 带缓存通道
 阻塞条件
 通道被填满
 通道为空
 通道的多路复用
 select
 模拟远程调用的RPC
 概念:简化进程间通讯的过程。RPC有效的封装通信的过程,让远程数据的收发通信过程看起来像是本地函数调用一样。
 客户端请求接收封装
 服务器接收和反馈数据
 模拟超时
 主流程
 使用通道响应计时器的时间
 一段时间之后执行函数
 time.AfterFun(时间,fun(){})
 定点计时
 打点
 time.NewTicker()
 计时器
 time.NewTimer()
 示例
 接收连接
 会话处理
 Telnet命令处理
 程序数入口
 测试输入字符串
 测试关闭会话
 同步
 竟态检测—检测代码在并发的环境下可能出现的问题
 原子操作函数
 atomic
 运行命令 go run -race *.go
 互斥锁—保证同一时刻只有一个gotoutine可以访问共享资源
 sync.Mutex
 读写互斥锁(sync.RWMutex)—在读比写多的情况下,比互斥锁更高效
 等待组(sync.WaitGroup)—保证并发环境中完成指定数量的任务
 反射
 概念
 程序运行期对程序本身进行访问和修改的能力
 C/C++都不支持; Java和C#语言都支持完整的反射;Lua、JS类型的动态语言特性,不需要反射。
 实现包:reflect
 反射的类型对象
 .Name()
 名称、结构体的名
 .Kind()
 种类、结构体的类型
 reflect.TypeOf
 ptr.Elem
 子主题 5
 反射的值对象
 reflect.Value
 示例
 编译与工具
 测试
 基本规范
 go文件必须以_test结尾
 函数必须以Test打头
 测试命令 go test -v _test.go
 -v显示详细流程
 单元测试—测试和验证代码的框架
 单元测试命令行
 运行指定单元测试用例
 go test -v -run Test *-test.go
 标记单元测试结果
 单元测试日志
 基准测试—获取戴拿内存占用和运行效率的性能数据
 基础测试基本使用
 go test -v -bench=. *_test.go
 基准测试原理
 自定义测试时间
 go test -v bench=. -benchtime=5s *_test.go
 测试内存
 go test -v -bench=Alloc -benchmen *_test.go
 控制计数器
 b.ResetTimer()
 b.StopTimer()
 b.StartTimer()
 避坑与技巧
 合理的使用并发性
 goroutine的生命周期
 避免不必要的地方使用通道
 套接字接收部分
 连接、关闭、同步goroutine主流程部分
 优化:使用等待组替代通道简化同步
 反射:性能和灵活的双刃剑
 反射技术的应用
 IOC控制反转
 Inversion Of Control
 DI依赖注入
 Dependency Injection
 go语言的包 martini
 结构体成员赋值对比
 结构体成员搜索并赋值对比
 调用函数对比
 基准测试结果对比
 接口nil判断
 nil类型fmt.Stringer
 map的多值索引—多个数值条件可以同时查询
 基于哈希值的多值索引
 概念:传统的索引过程是将输入数据作为特征值
 将特征值用某种算法转为整数
 将特征值转为字符串
 字符串转哈希值
 查询键
 构建索引
 查询逻辑
 利用map特性的多值索引
 构建索引
 查询逻辑
 优雅的处理TCP粘包
 封包发送
 连接器
 接收器
 封包读取
 服务连接会话
 测试粘包处理
 实战演练(剖析cellent网络库设计并实现Socket聊天功能)
 了解cellet测网络特性、流程及架构
 管理TCP Socket的连接
 组织接收和发送数据流程的Socket的会话(Session)
 排队处理事件的事件队列(Event Queue)
 消息编码(codec)
 消息元消息
 接收和发送封包
 使用cellnet网络库实现聊天功能

 Xmid百度网盘下载地址
 链接:https://pan.baidu.com/s/1SYXdE0HInE9PnQ8bwCzuEw
 提取码
- List item
 
:6b1u