本书主要从初识go语言、go语言基本语法和使用、容器:存储和组织数据的方式、流程控制、函数、结构体、接口、包、并发、反射、编译与工具、避坑与技巧、实战演练(剖析cellent的网络库设计并实现socket聊天功能)

书籍封面

go语言从入门到精通 go语言从入门到进阶实战 pdf_go语言

初识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网络库实现聊天功能

go语言从入门到精通 go语言从入门到进阶实战 pdf_go_02


Xmid百度网盘下载地址

链接:https://pan.baidu.com/s/1SYXdE0HInE9PnQ8bwCzuEw

提取码

  1. List item

:6b1u