栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Go:切片(Slice)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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))

结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/687215.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号