Go 切片的遍历、注意事项和使用细节

切片的遍历

  • 切片的遍历和数组一样,也有两种方式
    • for 循环常规方式遍历
//使用常规的for循环遍历切片
var arr [5]int = [...]int{10, 20, 30, 40, 50}
slice := arr[1:4]
for i := 0; i < len(slice); i++ {
	fmt.Printf("slice[%v]=%v ", i, slice[i])
}
  • 输出结果:


  • for-range 结构遍历切片
var arr [5]int = [...]int{10, 20, 30, 40, 50}
slice := arr[1:4]
//使用for--range 方式遍历切片
for i, v := range slice {
	fmt.Printf("i=%v v=%v \n", i, v)
}
  • 输出结果:


注意事项和使用细节

  • 切片初始化时 var slice = arr[startIndex:endIndex]
    • 说明:从 arr 数组下标为 startIndex,取到 下标为 endIndex 的元素(不含 arr[endIndex])
  • 切片初始化时,仍然不能越界范围在 [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[:]

  • cap 是一个内置函数,用于统计切片的容量,即最大可以存放多少个元素。
  • 切片定义完后,还不能使用,因为本身是一个空的,需要让其引用到一个数组,或者 make 一个空间供切片来使用
  • 切片可以继续切片

Go 切片的遍历、注意事项和使用细节_第1张图片


  • 用 append 内置函数,可以对切片进行动态追加

Go 切片的遍历、注意事项和使用细节_第2张图片


  • 案例演示:

Go 切片的遍历、注意事项和使用细节_第3张图片

  • 原理图

Go 切片的遍历、注意事项和使用细节_第4张图片

  • 切片 append 操作的底层原理分析:
    • 切片 append 操作的本质就是对数组扩容
    • go 底层会创建一下新的数组 newArr(安装扩容后大小)
    • 将 slice 原来包含的元素拷贝到新的数组 newArr
    • slice 重新引用到 newArr
    • 注意 newArr 是在底层来维护的,程序员不可见.

  • 切片的拷贝操作
    • 切片使用 copy 内置函数完成拷贝,举例说明

Go 切片的遍历、注意事项和使用细节_第5张图片

  • 案例演示:
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
  • 输出结果:

  • 对上面代码的说明:
    • copy(para1, para2) 参数的数据类型是切片
    • 按照上面的代码来看, slice4 和 slice5 的数据空间是独立,相互不影响,也就是说 slice4[0]= 999, slice5[0] 仍然是 1

关于拷贝的注意事项

Go 切片的遍历、注意事项和使用细节_第6张图片

  • 说明: 上面的代码没有问题,可以运行, 最后输出的是 [1]
 
  • 切片是引用类型,所以在传递时,遵守引用传递机制
    • 看两段代码,并分析底层原理

Go 切片的遍历、注意事项和使用细节_第7张图片

func test(slice []int) {
	slice[0] = 100  //这里修改slice[0],会改变实参
	}
	
func main() {

	var slice = []int {1, 2, 3, 4}
	fmt.Println("slice=", slice) // [1,2,3,4]
	test(slice)
	fmt.Println("slice=", slice) // [100, 2, 3, 4]
}
  • 输出结果:

你可能感兴趣的:(Golang基础,go)