《go语言从入门到进阶实战》知识点总结概要

本书主要从初识go语言、go语言基本语法和使用、容器:存储和组织数据的方式、流程控制、函数、结构体、接口、包、并发、反射、编译与工具、避坑与技巧、实战演练(剖析cellent的网络库设计并实现socket聊天功能)
书籍封面
《go语言从入门到进阶实战》知识点总结概要_第1张图片

初识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语言从入门到进阶实战》知识点总结概要_第2张图片
Xmid百度网盘下载地址
链接:https://pan.baidu.com/s/1SYXdE0HInE9PnQ8bwCzuEw
提取码

  1. List item

:6b1u

你可能感兴趣的:(《go语言从入门到进阶实战》知识点总结概要)