ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Go面试必问之slice扩容机制与底层原理

Go面试必问之slice扩容机制与底层原理 Go面试必问之slice扩容机制与底层原理文章导语“Go的slice是如何扩容的”——这是Go面试中几乎必问的问题。本文从slice底层结构出发详细拆解扩容算法、内存对齐和常见陷阱。一、扩容算法演进// Go 1.17及之前: 简单翻倍// cap 1024 → 2x// cap 1024 → 1.25x// Go 1.18 新算法:newcap:old.capdoublecap:newcapnewcapifnewLendoublecap{newcapnewLen}else{constthreshold256ifold.capthreshold{newcapdoublecap}else{// 平滑过渡公式for0newcapnewcapnewLen{newcap(newcap3*threshold)/4}}}二、面试常见追问Q: append后为什么原slice可能不变A: 扩容时分配了新底层数组新旧slice指向不同数组。Q: nil slice可以append吗A: 可以append会自动分配底层数组。Q: 子切片的append为什么可能影响原切片A: 共享底层数组未触发扩容→修改了原数组。三、全文总结slice扩容核心三要素需要的容量、扩容策略、内存对齐调整。1.18后扩容更平滑。参考文献Go源码 runtime/slice.go growsliceGo Blog - Slice internals
返回列表