Go 语言是如何实现切片扩容

简介: Go 语言是如何实现切片扩容

Go 语言中的切片(slice)是一个非常灵活的数据结构,它可以根据需求自动扩容。slice 的扩容机制如下:

  1. 初始容量:

    • 当使用 make([]T, len, cap) 创建 slice 时,可以指定初始长度 len 和容量 cap
    • 如果只指定长度,则容量默认等于长度。
  2. 添加元素时的扩容:

    • 当向 slice 中添加元素,并且当前容量不足时,Go 运行时会自动扩容。
    • 扩容策略是: 新容量 = 旧容量 + max(旧容量, 1)。
    • 也就是说,容量每次会至少翻倍,直到满足新增元素的需求。
  3. 扩容过程:

    • 分配一块新的连续内存空间,容量是旧容量的 1.5 倍或更大。
    • 将旧 slice 中的元素拷贝到新内存空间。
    • 更新 slice 的底层数组指针、长度和容量。
  4. 复制数据:

    • 扩容时会将旧 slice 中的数据完整地拷贝到新的内存空间。
    • 这意味着如果 slice 中的元素是指针或其他引用类型,那么这些引用也会被拷贝。

示例代码:

package main

import "fmt"

func main() {
   
    // 初始容量为 3
    s := make([]int, 0, 3)

    // 添加元素直到触发扩容
    for i := 0; i < 10; i++ {
   
        s = append(s, i)
        fmt.Printf("len=%d, cap=%d\n", len(s), cap(s))
    }
}

输出:

len=1, cap=3
len=2, cap=3
len=3, cap=3
len=4, cap=6
len=5, cap=6
len=6, cap=6
len=7, cap=9
len=8, cap=9
len=9, cap=9
len=10, cap=15

从输出中可以看到,slice 的容量每次都会增加一倍以上,直到满足新增元素的需求。这种扩容机制保证了 slice 的灵活性和性能。

相关文章
|
存储 JSON 安全
Go语言切片,使用技巧与避坑指南
Go语言中的切片(Slice)是动态引用数组的高效数据结构,支持扩容与截取。本文从切片基础、常用操作到高级技巧全面解析,涵盖创建方式、`append`扩容机制、共享陷阱及安全复制等内容。通过代码示例详解切片特性,如预分配优化性能、区分`nil`与空切片、处理多维切片等。掌握这些核心知识点,可编写更高效的Go代码。
469 2
|
9月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
415 2
|
11月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
634 1
|
12月前
|
数据采集 机器学习/深度学习 存储
Go语言实战案例 - 找出切片中的最大值与最小值
本案例通过实现查找整数切片中的最大值与最小值,帮助初学者掌握遍历、比较和错误处理技巧,内容涵盖算法基础、应用场景及完整代码示例,适合初学者提升编程能力。
|
11月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
635 0
|
11月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
457 0
|
11月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
497 0
|
11月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
693 0
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
11月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。