Go语言切片(Slice)学习笔记

什么是切片?

切片(Slice)是一个动态数组,它可以按需自动增长和缩小,而且与数组相比,切片的长度是可以改变的。在Go语言中,切片是一种引用类型,它由指向底层数组的指针、切片的长度和切片的容量组成。

切片的创建与初始化

使用make()函数来创建切片

Go语言提供了内置函数make()来创建切片。make()函数的参数有两个,第一个为切片类型,第二个为长度,可以选择性地指定容量。如下所示:

goCopy Code
// 创建一个长度为5,容量为10的整型切片 slice := make([]int, 5, 10)

直接声明并初始化切片

切片也可以像数组一样使用字面量直接声明并初始化。不过和数组不同的是,切片长度不需要指定。例如:

goCopy Code
// 声明一个字符串切片 var strSlice []string // 直接初始化一个整型切片 numSlice := []int{1, 2, 3, 4, 5}

切片的基本操作

通过索引访问切片元素

要访问切片中的元素,可以使用类似于数组的下标方式,指定元素的位置。例如:

goCopy Code
// 创建一个整型切片 nums := []int{1, 2, 3, 4, 5} // 访问第三个元素 fmt.Println(nums[2]) // 输出:3

对切片进行追加元素

切片是可以动态增长的,可以使用内置的append()函数来追加元素。例如:

goCopy Code
// 创建一个初始值为空的整型切片 nums := []int{} // 追加元素到切片中 nums = append(nums, 1) nums = append(nums, 2, 3)

对切片进行复制

可以使用内置的copy()函数来复制一个切片。例如:

goCopy Code
// 创建一个含有5个元素的整型切片 nums1 := []int{1, 2, 3, 4, 5} // 复制nums1这个整型切片 nums2 := make([]int, len(nums1)) copy(nums2, nums1) // 修改nums1的第一个元素 nums1[0] = 100 // 输出两个切片,可以看到修改nums1后,nums2并没有跟着发生变化 fmt.Println(nums1) // 输出:[100 2 3 4 5] fmt.Println(nums2) // 输出:[1 2 3 4 5]

实例

下面我们来看一个实际的例子,展示如何使用切片来实现一个简单的栈结构。

goCopy Code
package main import "fmt" type Stack struct { data []interface{} } func NewStack() *Stack { return &Stack{} } func (s *Stack) Push(val interface{}) { s.data = append(s.data, val) } func (s *Stack) Pop() interface{} { if s.IsEmpty() { return nil } val := s.data[len(s.data)-1] s.data = s.data[:len(s.data)-1] return val } func (s *Stack) Peek() interface{} { if s.IsEmpty() { return nil } return s.data[len(s.data)-1] } func (s *Stack) IsEmpty() bool { return len(s.data) == 0 } func main() { stack := NewStack() stack.Push(1) stack.Push(2) stack.Push(3) fmt.Println(stack.Pop()) // 输出:3 fmt.Println(stack.Pop()) // 输出:2 fmt.Println(stack.Peek()) // 输出:1 }

在这个例子中,我们使用切片来存储数据,实现了一个简单的栈结构。通过定义Push()Pop()Peek()IsEmpty()等方法,实现了对栈结构的基本操作。