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 Codepackage 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()
等方法,实现了对栈结构的基本操作。