【Go】27、golang切片的初始化
- 切片的初始化方法很多,可以直接初始化,也可以使用数组初始化等
1、直接初始化
- 语法:
var name = []T{元素值}
# 或
name := []T{元素值}- T:数据类型
func f1() {
s := []int{1, 2, 3}
fmt.Printf("s: %v\n", s)
}
func main(){
f1()
}2、使用数组初始化
- 语法:
var name = [...]int{1, 2, 3, 4, 5, 6} // 数组
var s1 = name[start:end] // start:end是下标
# 或
s1 := name[start:end]- 从 start 索引到 end-1 索引之间的元素构成的子集
func f2() {
// 数组
a := [...]int{1, 2, 3, 4, 5, 6}
a4 := a[:]
fmt.Printf("a4: %v\n", a4)
}
func main() {
f2()
}
# 输出结果:
a4: [1 2 3 4 5 6]3、使用数组的部分元素初始化(切片表达式)和2的语法一样
- 切片的底层就是一个数组,所以我们可以基于数组通过切片表达式得到切片。 切片表达式中的low和high表示一个索引范围(左包含,右不包含),得到的切片长度=high-low,容量等于得到的切片的底层数组的容量。
func f2() {
// 数组
a := [...]int{1, 2, 3, 4, 5, 6}
a1 := a[0:3]
fmt.Printf("a1: %v\n", a1)
a2 := a[3:]
fmt.Printf("a2: %v\n", a2)
a3 := a[2:5]
fmt.Printf("a3: %v\n", a3)
a4 := a[:]
fmt.Printf("a4: %v\n", a4)
}
func main() {
f2()
}
# 输出结果:
a1: [1 2 3]
a2: [4 5 6]
a3: [3 4 5]
a4: [1 2 3 4 5 6]4、空(nil)切片
- 一个切片在未初始化之前默认为nil,长度为0,容量为0
func f3() {
// 空切片
var s []int
fmt.Printf("s: %v\n", s)
fmt.Printf("len(s): %v\n", len(s))
fmt.Printf("cap(s): %v\n", cap(s))
fmt.Println(s == nil)
}
func main() {
f3()
}
# 输出结果:
s: []
len(s): 0
cap(s): 0
true5、注意
- 对于数组或字符串,如果0 <= low <= high <= len(a),则索引合法,否则就会索引越界(out of range)。
- 对切片再执行切片表达式时(切片再切片),high的上限边界是切片的容量cap(a),而不是长度。常量索引必须是非负的,并且可以用int类型的值表示;对于数组或常量字符串,常量索引也必须在有效范围内。如果low和high两个指标都是常数,它们必须满足low <= high。如果索引在运行时超出范围,就会发生运行时panic。
本文来自博客园,作者:郭祺迦,转载请注明原文链接:https://www.cnblogs.com/guojie-guojie/p/16400686.html

浙公网安备 33010602011771号