切片的定义
在Go语言中,可以通过make函数和切片字面量(slice literal)两种方式来创建切片。
使用make函数创建切片
make函数的声明如下:
代码语言:javascript复制func make([]T, len, cap) []T
其中,T
表示切片的元素类型,len
表示切片的长度,cap
表示切片的容量。len
和cap
的区别在于:
len
表示切片中实际存储的元素个数,即切片的长度;cap
表示切片中底层数组的容量,即切片的最大长度。
使用make函数创建切片的语法如下:
代码语言:javascript复制slice := make([]T, len, cap)
其中,T
表示切片的元素类型,len
表示切片的长度,cap
表示切片的容量。下面是一个使用make函数创建切片的例子:
goCopy codepackage main
import "fmt"
func main() {
slice := make([]int, 3, 5)
fmt.Printf("slice=%v, len=%d, cap=%dn", slice, len(slice), cap(slice))
}
上面的代码中,创建了一个长度为3,容量为5的切片,切片中的元素类型为int。输出的结果为:
代码语言:javascript复制slice=[0 0 0], len=3, cap=5
使用切片字面量创建切片
切片字面量是一种简洁的方式来创建切片,其语法如下:
代码语言:javascript复制[]T{v1, v2, ..., vn}
其中,T
表示切片的元素类型,v1
、v2
、...、vn
表示切片中的元素。下面是一个使用切片字面量创建切片的例子:
package main
import "fmt"
func main() {
slice := []int{1, 2, 3}
fmt.Printf("slice=%v, len=%d, cap=%dn", slice, len(slice), cap(slice))
}
上面的代码中,创建了一个包含3个元素的切片,切片中的元素分别为1、2和3。输出的结果为:
代码语言:javascript复制slice=[1 2 3], len=3, cap=3
在使用切片字面量创建切片时,可以省略切片容量的声明,Go语言会根据切片的长度自动计算容量。例如:
代码语言:javascript复制package main
import "fmt"
func main() {
// 创建一个切片
slice1 := make([]int, 3)
// 打印切片的长度和容量
fmt.Println("len:", len(slice1))
fmt.Println("cap:", cap(slice1))
// 打印切片的值
fmt.Println("slice1:", slice1)
// 向切片中添加元素
slice1 = append(slice1, 4, 5, 6)
// 打印切片的长度和容量
fmt.Println("len:", len(slice1))
fmt.Println("cap:", cap(slice1))
// 打印切片的值
fmt.Println("slice1:", slice1)
// 创建一个长度为5,容量为10的切片
slice2 := make([]int, 5, 10)
// 打印切片的长度和容量
fmt.Println("len:", len(slice2))
fmt.Println("cap:", cap(slice2))
// 打印切片的值
fmt.Println("slice2:", slice2)
}
输出结果:
代码语言:javascript复制len: 3
cap: 3
slice1: [0 0 0]
len: 6
cap: 6
slice1: [0 0 0 4 5 6]
len: 5
cap: 10
slice2: [0 0 0 0 0]
在这个示例中,我们创建了两个切片slice1
和slice2
,并使用make
函数来分配内存空间。slice1
的长度和容量都为3,初始值都是0。我们向slice1
中添加了三个元素4、5和6,此时slice1
的长度变成了6,容量也变成了6。slice2
的长度为5,容量为10,初始值都是0。
在Go中,切片可以自动扩容,当容量不足时,系统会重新分配一块更大的内存,将原来的元素复制到新的内存中,并返回新的切片。append
函数可以向切片中添加元素,如果切片的容量不足,系统会自动扩容。
切片的长度可以使用len
函数来获取,容量可以使用cap
函数来获取。如果想要手动指定切片的容量,可以在创建切片时传入第二个参数,例如make([]int, 5, 10)
表示创建一个长度为5,容量为10的切片。