P116 今日分享
P117今日内容概要
P118 内容回顾01
锁。sync.Mutex是一个结构体,值类型,给函数传参的时候要传指针
等待组不传指针,是因为一般都定义全局的变量,用来等goroutine执行完再继续
为什么要用锁。防止同一时刻多个goroutine操作同一个资源
读写互斥锁,适用于读多写少的场景。
读的时候其他也能读
写的时候其他不能读写
等待组的使用。
wg.Add(n)起多少个goroutine就加几个计数
wg.Done在goroutine函数中,结束时表示完成,计数器-1
wg.Wait 等待所有的goroutine都结束
sync.Once某些函数只需要执行一次的时候使用
once.Do()接收一个没有参数没有返回值的函数,如果需要可以闭包
内置的map不是并发安全的,并发操作map会报错,所以又了sync.Map
GO语言内置了一些针对内置的基本数据类型的一些并发安全的操作,原子操作
P119 内容回顾02
OSI七层模型,应表会传网数物。
数据链路层是以太网协议,传的高低电平。
网络层ip协议,网卡唯一的mac地址
传输层,tcp,udp
会话层,smtp邮件。
表示层,jpg
socket编程是个抽象层,自己在写软件的时候不需要取关注tcp,udp了,调用socket的一个方法就能起一个服务
提升网络效率的时候,往往建立tcp连接后,不是马上发送数据,而是等待一段时间看看是否还有要发送的数据一起发出去
P120 http serer端
客户端相当于浏览器,服务端相当于网站
字符串本质上就是字节的切片,可以强制类型转换
可以从文件里去读
读出来的内容是个slice,写到返回体里
这个文本 就是写在xx.txt里的内容
浏览器会去渲染
GET请求 。请求路径,http协议
host访问地址是什么
connection:keep-alive长连接
progma:no-cache 不缓存
user-agent:终端
accept:期待得到一个什么 类型的返回数据
accept-enccoding 期待接收的编码形式
accept-language 允许的语言
找到i1的标签,修改地址
P121 http _client
写一个http_server
下一个client,模拟请求操作
在客户端读出服务端返回的body
读到客户端请求的一些信息
发送参数试试能否取到
get请求的数据不在body里
现在就拿到参数了
req是个请求对象
一定要关闭resp.body
造一个禁用keepalive的传输模式
可以全局只用一个client
下面这段代码适用请求不是特别 频繁的
P122 单元测试
开发自己给自己的代码写测试
所有的测试函数都需要Test开头
假如写一个切割字符串的函数
你写了一个包,别人需要这样来调用
再写一个
同一个包调用,单元测试
go test会去找当前包下划线test结尾i的文件,挨个去执行
这些就是docker项目里的test文件
P123 测试组和子测试
第一次执行的时候传进来两个参数
先申明ret变量,字符串切片
找到分割字符,就进行for循环,append给slice追加
新增测试就失败了
**说明之前字符串切割还是有问题的,进行修改 **
再测试就OK了
中间有些失败
使用一个map,不用切片了,下面遍历一个map
这样可以单独跑某一个测试用例
一般是60%
go test -cover测试覆盖率
也可以输出文件
html会打开一个页面
绿色都是覆盖到了
P124 性能基准测试
基准行测试。执行了1000万次
这一行代码节省了内存开销
险些一个公用的,包装进去
别人调用了几个,看参数就知道跑了多少个
默认就执行1秒,如果等1秒,就执行一次
指定多少个goroutine去执行
setup测试前的准备工作,teardown收尾工作
进行子测试的时候进行一个setup
P125 性能优化简介
net/http/pprof封装了runtime/pprof库
采集cpu指标信息
采集内存相关信息
测试服务型的应用
通道没初始化就是nil,会阻塞
参数
P126 flag包用法
os.Args是个slice,可以直接取值
*&取地址,从地址取值
这样就拿到了参数
时间间隔
类型是time.duration类型
传一个内存地址。&name
解析一定要用Parse
Args把传进来的参数都以切片的形式打印出来。
Narg返回命令行承诺书后的其他参数个数。
NFlag 返回使用的命令行参数个数
P127 pprof性能调优简介
**上面定义两个指标,是否开启cpu和内存 profile的标志位,不加–mem --cpu默认就是false,不开启标志位。
**
如果cpupprof是true,就进入下面代码执行,创建一个cpu.pprof文件,开始记录cpu的一些信息,往文件里去写。
这个文件,列出了程序20秒中,cpu的信息
交互页面,top 3,可以看到前3个占用cpu多的函数
重新修改之前的代码
flat 当前函数占用cpu的耗时
flat% 当前函数占用cpu的耗时百分比
相当于优化后的logicode不是最多占用cpu的服务了
list加函数名,可以看这个函数的哪一行出现了问题
下载这个图形化的可视化 工具
能够 分析占用cpu时间最长的那一段
火焰图
总共20s,19.11s被logiccode函数占用
测试优化后的代码
y轴表示cpu调用方法的先后,x表示每个采样时间内,方法所占的时间百分比。
P128 今日分享面试题
实现一个列表