1.slice的扩容机制

Go语言中的切片(slice)在进行append操作时,如果现有容量不足以容纳新的元素,Go运行时会自动为其扩容。Go 1.0至Go 1.16版本的扩容策略有所不同,但总的来说,扩容的基本机制如下:

  1. 初始容量

    • 新创建的切片默认容量为0或根据创建时提供的元素数量确定。
  2. 扩容规则

    • 当需要扩容时,Go语言的切片扩容机制通常是将其容量翻倍(cap *= 2),直到达到一定的阈值后(例如1024),扩容策略改为每次增长大约1/4(cap += cap / 4),以降低大型切片的扩容开销。

    • 自Go 1.16版本开始,扩容策略稍有改变,但仍基于翻倍原则,但在容量大于1024时,并非简单地增加1/4,而是使用更复杂的算法,旨在更好地平衡内存使用和性能。

  3. 特殊情况

    • 当切片的当前容量小于1000时,Go可能并不会严格遵循上述翻倍策略,而是采用更保守的扩容策略,以适应小容量切片的需求。
    • 如果所需的新增容量远大于当前容量,Go可能会直接将容量设置为所需容量,而不是简单地翻倍。
  4. 性能考量

    • 扩容操作伴随着内存分配和数据拷贝,因此在编写代码时应尽量避免过于频繁的扩容操作,可以预先估计数据量并使用make函数指定合适的初始容量。

2.tcp和udp的区别?

TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)是互联网协议族中最主要的两种传输层协议,它们的主要区别在于以下几个方面:

  1. 连接性

    • TCP 是面向连接的协议,通信双方在数据传输前需要先建立连接(三次握手),传输完毕后要关闭连接(四次挥手)。
    • UDP 是无连接的协议,发送数据前无需建立连接,数据直接发送出去,也不关心对方是否接收。
  2. 可靠性

    • TCP 提供可靠的数据传输服务,通过序列号、确认应答、超时重传、流量控制、拥塞控制等机制保证数据的有序、无丢失、无重复传输。
    • UDP 不提供可靠传输,数据包可能丢失、重复、乱序到达,而且不进行重传,也没有流量控制和拥塞控制。
  3. 效率

    • TCP 因为提供了许多保障数据正确传输的服务,所以相对而言开销较大,速度略慢。
    • UDP 因为没有这些额外的保障机制,所以数据传输效率更高,速度更快。
  4. 应用场合

    • TCP 适用于对数据完整性要求高的应用,如HTTP、HTTPS、FTP、SMTP(邮件)等。
    • UDP 适用于对实时性要求较高、能接受偶尔丢包但要求速度快的应用,如DNS查询、VoIP电话、在线视频直播、实时游戏等。
  5. 数据包结构

    • TCP 数据包除了数据部分还包括序号、确认号、窗口大小等字段,用于保证数据传输的可靠性。
    • UDP 数据包结构相对简单,包含源端口、目的端口、长度和检验和,不提供复杂的错误纠正功能。
  6. 数据传输大小

    • TCP 没有严格的包大小限制,理论上可以传输任意大小的数据。
    • UDP 数据包大小受限于其首部中的长度字段,通常不超过64KB(IPv4)或1280字节(IPv6最小MTU),超过部分需要分片传输,但分片可能导致数据丢失和重组延迟。
最后编辑: kuteng  文档更新时间: 2024-04-02 09:53   作者:kuteng