优点
动态存储分配
数据更新效率高,O(1)
缺点
浪费了部分空间用来存储指针域
查询效率低,O(n)
增加一个头节点
空节点,不存储数据
- 优化链代码效率,避免了链表是否为空的判断
技巧
判断链表是否为空
头节点到链域为空,则链表为空
定位到尾节点
尾节点的特点是链域为空。
所以挨个遍历,当当前节点到链域为空时,说明当前节点为尾节点
动态存储分配
数据更新效率高,O(1)
浪费了部分空间用来存储指针域
查询效率低,O(n)
空节点,不存储数据
判断链表是否为空
头节点到链域为空,则链表为空
定位到尾节点
尾节点的特点是链域为空。
所以挨个遍历,当当前节点到链域为空时,说明当前节点为尾节点
PSH(push)
置位后,数据立马发送,而不是填充到缓冲区等待发送
窗口值
报文发送方的接收缓冲区大小(tcp是双工的),允许对方发送的最大数据量
3次握手中,为什么客户端最后还需要确认一次?
为了防止服务端响应了已失效的连接请求报文。
假设没有再次确认,当客户端发出一次连接请求时,由于某种原因,该报文被滞留。
后续客户端又重新发送报文,与服务端建立了连接。
而此时服务端收到了之前的连接请求报文,又建立了连接,此时便导致错误。
linux下,默认最大打开文件数为1024(ulimit -n
)
一个进程打开,默认占用3个文件描述符(0,1,2分别对应标准输入,标准输出,标准出错)
默认情况下,单进程最大打开文件数为1021个([3,1023])
单进程,最大连接数为1021个
1 | http { |
数据必须是Unicode
编码,默认编码方式为UTF-8
因为json
数据前2个字符总是ASCII
字符({"
,与[空格]
的组合),所以可以推断出其编码方式
1 | 00 00 00 xx UTF-32BE |
若采用UTF-16
或UTF-32
,则需要设置content-transfer-encoding
为binary
??
参考:
代码风格统一(命名,缩进)
以首字母大小写区分成员是public
还是privite
强制缩进风格
错误处理方式优雅统一
资源释放方式优雅统一(defer
)
非侵入式接口
发布,运维方便
包管理机制
垃圾自动回收
静态类型
反射
json
, xml
, gob
,…)函数多返回值,提供多重赋值
优雅地同时返回结果和错误
返回多个结果不用像C/C++那样,定义额外的结构体或多个传出参数
高效并发,方便的同步机制
自带单元测试
自带很多好用的库,如log
,encoding/json
,net/http
,…
强大好用的命令行工具,如gofmt
,gocode
,…
方便的枚举常量定义(iota
)
1 | location / { |