Go 语言 切片的创建 扩容与复制操作

Go阿木 发布于 2025-06-22 6 次阅读


摘要:

切片是 Go 语言中一种灵活且强大的数据结构,它提供了对数组操作的动态支持。本文将围绕 Go 语言切片的创建、扩容与复制操作进行深入探讨,通过代码示例展示如何高效地使用切片。

一、

在 Go 语言中,切片(Slice)是一种可以动态改变大小的数组。它由三个部分组成:底层数组、切片长度和切片容量。切片提供了对数组操作的便捷性,如插入、删除、复制等。本文将详细介绍切片的创建、扩容与复制操作。

二、切片的创建

切片的创建可以通过以下几种方式实现:

1. 使用内建函数 `make` 创建切片

go

s := make([]Type, len, cap)


其中,`Type` 是切片中元素的类型,`len` 是切片的长度,`cap` 是切片的容量。

2. 使用内建函数 `new` 创建切片

go

s := new([]Type)


使用 `new` 创建切片时,切片的长度和容量都是 0。

3. 直接赋值创建切片

go

s := []Type{element1, element2, ...}


这种方式创建的切片长度和容量相等。

三、切片的扩容

切片的扩容是指增加切片的容量。在 Go 语言中,切片的扩容操作是通过 `append` 函数实现的。以下是一个扩容的示例:

go

s := []int{1, 2, 3}


s = append(s, 4, 5, 6) // 切片扩容,容量变为 6


在上面的示例中,原始切片 `s` 的容量为 3,通过 `append` 函数添加了 3 个元素,切片的容量自动扩容为 6。

四、切片的复制

切片的复制可以通过以下几种方式实现:

1. 使用内建函数 `copy` 复制切片

go

dest := make([]Type, len(s))


copy(dest, s)


使用 `copy` 函数可以将源切片 `s` 的所有元素复制到目标切片 `dest` 中。

2. 直接赋值复制切片

go

s2 := s // 创建一个新的切片,指向相同的底层数组


这种方式创建的切片 `s2` 和源切片 `s` 共享相同的底层数组,但它们的长度和容量是独立的。

3. 使用切片的索引复制

go

s2 := s[low:high] // 创建一个新的切片,包含从索引 low 到 high 的元素


这种方式创建的切片 `s2` 和源切片 `s` 共享相同的底层数组,但它们的长度和容量是独立的。

五、代码示例

以下是一个综合示例,展示了切片的创建、扩容和复制操作:

go

package main

import "fmt"

func main() {


// 创建切片


s := make([]int, 3, 5)


fmt.Println("s:", s) // 输出: s: [0 0 0]

// 扩容切片


s = append(s, 1, 2, 3, 4, 5)


fmt.Println("s:", s) // 输出: s: [0 0 0 1 2 3 4 5]

// 复制切片


s2 := make([]int, len(s))


copy(s2, s)


fmt.Println("s2:", s2) // 输出: s2: [0 0 0 1 2 3 4 5]

// 直接赋值复制切片


s3 := s


s[0] = 100


fmt.Println("s:", s) // 输出: s: [100 0 0 1 2 3 4 5]


fmt.Println("s3:", s3) // 输出: s3: [100 0 0 1 2 3 4 5]

// 使用切片的索引复制


s4 := s[1:4]


s[2] = 200


fmt.Println("s:", s) // 输出: s: [100 0 200 1 2 3 4 5]


fmt.Println("s4:", s4) // 输出: s4: [0 200 1]


}


六、总结

切片是 Go 语言中一种灵活且强大的数据结构,它提供了对数组操作的动态支持。本文通过代码示例详细介绍了切片的创建、扩容与复制操作,帮助读者更好地理解和应用切片。在实际编程中,合理使用切片可以提高代码的效率和可读性。