Go 语言学习笔记之数组与切片

打印 上一主题 下一主题

主题 877|帖子 877|积分 2631

各人好,我是码农先森。
数组与切片的区别

在 Go 语言中,数组和切片是两种不同的数据结构,它们之间有以下主要区别。
参数长度:
数组(Array):数组的长度是固定的,在创建时就必要指定数组的长度,无法动态改变;只有长度信息,通过 len() 函数获取。
切片(Slice):切片是对数组的一个引用,底层使用的是数组的数据结构,具有动态长度,可以动态增加或淘汰元素,实现动态扩容;有长度和容量信息,通过 len() 和 cap() 函数可以获取。
参数传递:
数组:在函数间传递数组会举行值拷贝,较大的数组会导致性能开销。
切片:切片是对底层数组的引用,传递切片时只是传递引用,并不会复制整个数组,节省内存和性能。
切片的扩容

当一个切片通过切片操作(如 append、copy、slicing 等)对底层数组举行修改时,如果底层数组容量不足,会创建一个新的底层数组,并将数据复制到新的底层数组中,此时切片会指向新的底层数组。
追加一个元素时,如果切片的容量能够容纳新增元素,即切片的长度小于容量,那么切片的长度会增加 1,容量不变。
但如果超出了当前容量,即切片的长度等于容量,那么会触发切片的扩容,根据倍增规则重新分配底层数组,当原切片的长度大于或等于 1024 时,会以原容量的 1.25 倍作为新容量的基准;通过下面的例子和图解可以更加具体的了解扩容的过程。
[code]// 长度与容量相等func TestSlice(t *testing.T) {        var a []int        fmt.Printf("%v, %v\n", len(a), cap(a)) // 0, 0        a = append(a, 1)        a = append(a, 2)        fmt.Printf("%v, %v\n", len(a), cap(a)) // 2, 2}// 当元素的个数超过 1024 长度,则会以 (1280 / 1025) = 1.25 倍举行扩容func TestSlice(t *testing.T) {        var a []int        fmt.Printf("%v, %v\n", len(a), cap(a)) // 0, 0        i := 1        for i
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表