GO语言学习:切片

切片(slice)

因为数组的长度是不可变的 应用起来不够灵活 所以衍生出来切片
切片的长度是可变的

切片声明

 	var  s = []int{}
 

创建一个长度为0的切片


	 var  s = []int{1,2,3}
 

创建一个 长度为3的切片


	 var  s = make([]int,10)
 

使用make创建一个长度为10的切片


	 var  s = make([]int,10,20)
 

使用make创建一个长度为10的切片cap(容量)为20的切片

cap(容量)

	 var  s = make([]int,2,4)
	 fmt.Println("s的长度: ",len(s))
	 fmt.Println("s的容量: ",cap(s))
 

s的长度: 2
s的容量: 4
此时S的长度为2,容量为4。


	var  s = make([]int,2,4)
	fmt.Println("s的长度: ",len(s))
	fmt.Println("s的容量: ",cap(s))
	s=append(s,3 )
	fmt.Println(s)
	fmt.Println("s的长度: ",len(s))
	fmt.Println("s的容量: ",cap(s))
	s=append(s,4 )
	fmt.Println(s)
	fmt.Println("s的长度: ",len(s))
	fmt.Println("s的容量: ",cap(s))
	s=append(s,5 )
	fmt.Println(s)
	fmt.Println("s的长度: ",len(s))
	fmt.Println("s的容量: ",cap(s))

输出为:
s的长度: 2
s的容量: 4
[0 0 3]
s的长度: 3
s的容量: 4
[0 0 3 4]
s的长度: 4
s的容量: 4
[0 0 3 4 5]
s的长度: 5
s的容量: 8
-------------------------------------------------------------------------------------------------------------------------------------
当添加的元素时 超过S的容量
此时切片会自动扩容
扩容的方式为 当前长度 X 2
再具体的可以看看源码

注意事项

1.因为切片底层的扩容是 把扩容前的数组 复制到 扩容后的数组
为效率考虑 应该在一开始设定切片的容量(够用的容量)

切片是引用传递

	var  s = make([]int,2,4)
	s[0] = 1
	s[1] = 2
	fmt.Println(s)
	s2:=s
	s2[1]=100
	fmt.Println(s)

输出
[1 2]
[1 100]
当s2的元素值发生改变时 s的元素也发生了改变
可以看出 切片是引用传递

	 
	var  s1 = []int{1,2,3,4,5,6}
	s2 := s1[2:4]
	fmt.Println("s1 = ",s1)
	fmt.Println("s2 = ",s2)
 	s3:=s2[:4]
 	fmt.Println("s3 = ",s3)

输出
s1 = [1 2 3 4 5 6]
s2 = [3 4]
s3 = [3 4 5 6]
在这里插入图片描述
切片的底层就是一个数组,切片赋值时引用传递
s2 的长度虽然为2 在对S3赋值时 因为底层数组的原因 所以S3 = 3,4,5,6

append方法
	 
	var  s = []int{1,2,3,4,5,6}
	s= append(s,2 )
	s = append(s,3,4,5 )
	s = append(s, s...)
	

append 方法可以为切片添加元素
可以多个也可以当个
也可以是相同类型的切片

切片的遍历

切片的遍历和数组的遍历是一样的

	for   i:=0; i <len(s);i++{
		fmt.Println(s[i])
	}
	for  i,v := range s{
		fmt.Println(i,v)
	}

因为切片是引用传递 在赋值是都指向的是一个地址 所以!!COPY()
	var a = []int{1,2,3,4,5,6}
	var b =  make([]int,10,20)
	//将 a的元素拷贝到b里
	copy(b,a)
	fmt.Println("切片a的元素:  ",a)
	fmt.Println("切片b的元素:  ",b)

	fmt.Println("切片a的地址:  ",&a[1])
	fmt.Println("切片b的地址:  ",&b[1])

输出为
切片a的元素: [1 2 3 4 5 6]
切片b的元素: [1 2 3 4 5 6 0 0 0 0]
切片a[1]的地址: 0xc00000c2d8
切片b[1]的地址: 0xc00010c008
可以看出 a,b元素的地址是不同的

元素的删除

go语言中没有对元素进行删除的函数
但是可以利用 append()函数来实现元素删除

	var a = []int{1,2,3,4,5,6}

	a = append(a[0:1],a[2:6]... )

	fmt.Println(a)

输出为:[1 3 4 5 6]
删除了第二个元素

发布了8 篇原创文章 · 获赞 1 · 访问量 1048

猜你喜欢

转载自blog.csdn.net/ZHOUAXING/article/details/105011280