Go:切片(Slice)

Go:切片(Slice),第1张

Go:切片(Slice) 一.slice区间 *** 作

先看一段slice使用代码:

	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
	fmt.Println("arr[2:6]=", arr[2:6])
	fmt.Println("arr[:6]=", arr[:6])
	fmt.Println("arr[2:]=", arr[2:])
	fmt.Println("arr[:]=", arr[:])

运行结果:

可以发现,结果输出为数组的左开区间,右闭区间。

二.slice对数组 *** 作
func updateSlice(s []int) { //这里[]不加数字代表slice
	s[0] = 100
}
func main() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
	s1 := arr[2:]
	s2 := arr[:]
	fmt.Println("After updateSlice(s1):")
	updateSlice(s1)
	fmt.Println(s1)
	fmt.Println(arr)
	fmt.Println("After updateSlice(s2):")
	updateSlice(s2)
	fmt.Println(s2)
	fmt.Println(arr)
}

结果:

这种 *** 作就非常离谱,淦,和C/C++/Java *** 作都不一样。
原理:(对底层array的一个view)
这里新创建的s1和s2数组其实是对arr地址的映射,修改对应地址内的值,当然也会反射到arr数组上。

三.slice的slice(reslice)
s2 := arr[:]
s2 = s2[:5]
fmt.Println("s2[:5]", s2)
s2 = s2[2:]
fmt.Println("s2[2:]", s2)

结果:

四.slice的扩展(难想)
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:6]
s2 := s1[3:5]
fmt.Println("s1=", s1)
fmt.Println("s2=", s2)

结果:非常出人意料!!!

原理:slice可以向后扩展,不可以向前扩展。
其中ptr是指向的指针,len是长度,cap是向后扩展长度。
s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)

下面我们去获取len和cap:

arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:6]
s2 := s1[3:5]
fmt.Println("arr=", arr)
fmt.Printf("s1=%v,len(s1)=%d,cap(s1)=%dn", s1, len(s1), cap(s1))
fmt.Printf("s2=%v,len(s2)=%d,cap(s2)=%dn", s2, len(s2), cap(s2))

结果:

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5687741.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存