Golang面试-Day1

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),超过部分需要分片传输,但分片可能导致数据丢失和重组延迟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值