GO切片的删除-指针与非指针的区别

958 阅读1分钟
  1. 非指针,删除元素,失败,并没有影响到源切片
func TestDelOneElementFromSlice(t *testing.T) {
   arr := []int{1,2,3,4}
   fmt.Printf("test : %p\n",arr)
   drop1(&arr)
   fmt.Println(arr)
}

//非指针接收切片
func drop1(arr []int) {
   fmt.Printf("drop1 : %p\n",arr)
   arr = arr[:len(arr)-1]
}

运行结果:

图片.png

  1. 指针,删除元素,成功
func TestDelOneElementFromSlice(t *testing.T) {
   arr := []int{1,2,3,4}
   fmt.Printf("test : %p\n",arr)
   drop2(&arr)
   //swap(arr)
   //drop1(arr)
   fmt.Println(arr)
}

func drop2(arr *[]int) {
   p := *arr
   *arr = p[:len(p)-1]

   fmt.Printf("drop2 : %p\n",arr)
   fmt.Printf("drop2 p : %p\n",p)
}

运行结果: 图片.png

  1. 交换元素,无需指针也可成功
func TestDelOneElementFromSlice(t *testing.T) {
   arr := []int{1,2,3,4}
   fmt.Printf("test : %p\n",arr)
   //drop2(&arr)
   swap(arr)
   //drop1(arr)
   fmt.Println(arr)
}

func swap(arr []int) {
   arr[0],arr[1] = arr[1],arr[0]
}

运行结果:

图片.png