【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
    true
5、注意
  • 对于数组或字符串,如果0 <= low <= high <= len(a),则索引合法,否则就会索引越界(out of range)
  • 对切片再执行切片表达式时(切片再切片),high的上限边界是切片的容量cap(a),而不是长度。常量索引必须是非负的,并且可以用int类型的值表示;对于数组或常量字符串,常量索引也必须在有效范围内。如果low和high两个指标都是常数,它们必须满足low <= high。如果索引在运行时超出范围,就会发生运行时panic。

posted @ 2022-06-22 15:14  郭祺迦  阅读(1052)  评论(0)    收藏  举报