1.slice的扩容机制
Go语言中的切片(slice)在进行append操作时,如果现有容量不足以容纳新的元素,Go运行时会自动为其扩容。Go 1.0至Go 1.16版本的扩容策略有所不同,但总的来说,扩容的基本机制如下:
初始容量:
- 新创建的切片默认容量为0或根据创建时提供的元素数量确定。
扩容规则:
当需要扩容时,Go语言的切片扩容机制通常是将其容量翻倍(
cap *= 2
),直到达到一定的阈值后(例如1024),扩容策略改为每次增长大约1/4(cap += cap / 4
),以降低大型切片的扩容开销。自Go 1.16版本开始,扩容策略稍有改变,但仍基于翻倍原则,但在容量大于1024时,并非简单地增加1/4,而是使用更复杂的算法,旨在更好地平衡内存使用和性能。
特殊情况:
- 当切片的当前容量小于1000时,Go可能并不会严格遵循上述翻倍策略,而是采用更保守的扩容策略,以适应小容量切片的需求。
- 如果所需的新增容量远大于当前容量,Go可能会直接将容量设置为所需容量,而不是简单地翻倍。
性能考量:
- 扩容操作伴随着内存分配和数据拷贝,因此在编写代码时应尽量避免过于频繁的扩容操作,可以预先估计数据量并使用make函数指定合适的初始容量。
2.tcp和udp的区别?
TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)是互联网协议族中最主要的两种传输层协议,它们的主要区别在于以下几个方面:
连接性:
- TCP 是面向连接的协议,通信双方在数据传输前需要先建立连接(三次握手),传输完毕后要关闭连接(四次挥手)。
- UDP 是无连接的协议,发送数据前无需建立连接,数据直接发送出去,也不关心对方是否接收。
可靠性:
- TCP 提供可靠的数据传输服务,通过序列号、确认应答、超时重传、流量控制、拥塞控制等机制保证数据的有序、无丢失、无重复传输。
- UDP 不提供可靠传输,数据包可能丢失、重复、乱序到达,而且不进行重传,也没有流量控制和拥塞控制。
效率:
- TCP 因为提供了许多保障数据正确传输的服务,所以相对而言开销较大,速度略慢。
- UDP 因为没有这些额外的保障机制,所以数据传输效率更高,速度更快。
应用场合:
- TCP 适用于对数据完整性要求高的应用,如HTTP、HTTPS、FTP、SMTP(邮件)等。
- UDP 适用于对实时性要求较高、能接受偶尔丢包但要求速度快的应用,如DNS查询、VoIP电话、在线视频直播、实时游戏等。
数据包结构:
- TCP 数据包除了数据部分还包括序号、确认号、窗口大小等字段,用于保证数据传输的可靠性。
- UDP 数据包结构相对简单,包含源端口、目的端口、长度和检验和,不提供复杂的错误纠正功能。
数据传输大小:
- TCP 没有严格的包大小限制,理论上可以传输任意大小的数据。
- UDP 数据包大小受限于其首部中的长度字段,通常不超过64KB(IPv4)或1280字节(IPv6最小MTU),超过部分需要分片传输,但分片可能导致数据丢失和重组延迟。
最后编辑: kuteng 文档更新时间: 2024-04-02 09:53 作者:kuteng