使用切片的区别分析2

package main

func main(){
/*
方式1是直接引用数组,这个数组是实现存在的,程序员是可见的。
方式2是通过make来创建切片,make也会创建一个数组,是由切片在底层进行维护,程序员是看不见的,make创建切片的示意图;

切片的遍历
切片的遍历和数组一样,也有两种方式
for 循环常规方式遍历
案例演示:
for - range 结构遍历切片
案例演示

func main(){
//使用常规的for循环遍历切片
var arr [5]int = [...]int{10,20,30,40,50}
slice := arr[1:4]//20,30,40
for i := 0;i< len(slice);i++{
fmt.Printf("slice[%v]=%v",i,slice[i])
}
fmt.Println()
//for i,v := range slice{
fmt.Printf("i=%v v=%v \n",i,v)
}

切片注意事项和细节说明
切片初始化时 var slice = arr[start index:endlndex]
说明:从arr数组下标为startlndex,取到下标为endlndex的元素(不含arr[endlndex]).
2)切片初始化时,仍然不能与越界。范围在{0-len(arr)]之间,但是可以动态增长.
var slice = arr[0:end]可以简写 var slice =arr[:end]
var slice =arr[start:len(arr)]可以简写;var slice = arr[start:]
var slice = arr[0:len(arr)]可以简写:var slice = arr[:]
切片注意事项和细节说明
切片初始化时:var slice = arr [startlndex:endlndex]
说明:从arr数组下标为startlndex,取到下标为endlndex的元素(不含arr[endlndex]).
切片初始化时,仍然不能越界。范围在[0-len(arr)]之间,但是可以动态增长。
1)var slice = arr[0:end]可以简写var slice = arr[:end]
2)var slice =arr[start:len(arr)]可以简写:var slice = arr[start:]
3)var slice = arr[0:len(arr)]可以简写:var slice = arr[:]
cap时一个内置函数,用语统计切片的容量,即最大可以存放多少个元素。切片定义完后,还不能使用,因为本身时一个空的,需要让其引用到一个数组,或者make一个空间供切片来使用
切片可以继续切片[案例演示]
切片注意事项和细节说明
用append内置函数,可以对切片进行动态追加
var arr[5]int = [5]int{1,2,3,4,5}
var slice = arr [:]
//追加具体的元素
slice = append(slice,10,20,30)
fmt.Println("slice=",slice)

//在切片上最佳切片
var := []int{100,200}
slice = append(slice,a...)
fmt.Println("slice=",slice)
切片append操作的底层原理分析:
1)切片append操作的本质就是对数组扩容
2)go底层会创建一下新的数组newArr(安装扩容后大小)
3)将slice原来包含的元素拷贝到新的菽粟newArr
4)slice重新引用到newArr
5)注意newArr时在底层来维护的,程序员不可见
切片append操作的本质就是对数组扩容
go底层会创建一下新的数组newArr(安装扩容后大小)
将slice原来包含的元素拷贝到新的数组newArr
slice重新引用到newArr
注意newArr时在底层来维护的,程序员不可见
7)切片的拷贝操作
切片使用copy内置函数完成拷贝,举例说明
var slice4 []int = []int{1,2,3,4,5}
var slice5 = make([]int,10)
copy(slice5,slice4)
fmt.Println("slice4=",slice4)//1,2,3,4,5,
fmt.Println("slice5=",slice5)//1,2,3,4,5,0,0,0,0,0
对上面代码的说明
1)copy(para1,para2)参数的数据类型时切片
2)按照上面的代码来看,slice4和slice5的数据空间时独立,相互不影响,也就是说slice4[0]= 999,slice[0]仍然是1



//用append内值函数,可以对切片进行动态追加
var slice3[]int = []int{100,200,300}
//通过append直接给slice3追加具体的元素
slice3 = append(slice3,400,500,600)
//通过append直接给slice3追加给slice3
slice3 = append(slice3,slice3...)
fmt.Println("slice3",slice3)//100,200,300,400,500,600

slice3 = append(slice3,slice3...)
fmt.Println("slice3",slice3)//100,200,300,400,500,600


fmt.Println("slice4",slice4)//{100,200,300,400,500,600}
fmt.Println("slice4",slice4)//100,200,300,400,500,600

//切片的拷贝操作
切片使用copy内置函数完成拷贝,举例说明
var slice4 []int = []int{1,2,3,4,5}
var slice5 = make([]int,10)
copy(slice5,slice4)
fmt.Println("slice4=",slice4)//1,2,3,4,5
fmt.Println("slice5=",slice5)//1,2,3,4,5,0,0,0,0,0,

//
*/

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值