8.25Go之容器之切片复制

8.25Go之容器之切片复制

内置函数copy()

特点:

  • 将一个数组切片复制到另一个数组切片中,如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。

  • 可以使用append()函数进行切片的复制

copy()函数声明格式:

copy( destSlice, srcSlice []T) int
  • srcSlice 为数据来源切片

  • destSlice 为复制的目标(也就是将 srcSlice 复制到 destSlice)

  • 目标切片必须分配过空间且足够承载复制的元素个数,并且来源和目标的类型必须一致

  • copy() 函数的返回值表示实际发生复制的元素个数。--->实际复制过去多少个,结合切片的思想

copy()函数复制数组的实例:

package main

import "fmt"

func main() {
/*声明两个数组切片*/
slice1 := []int{1,2,3,4,5}
slice2 := []int{7,8,9}

/*使用copy函数对他们的元素进行操作*/
copy(slice1, slice2)
slice1[0] = 1
slice1[1] = 2
slice1[2] = 3
copy(slice2, slice1) //这个已经改变了数组当中的元素--->copy函数

fmt.Println(slice1)
fmt.Println(slice2)
}

copy() 函数的第一个参数是要复制的目标 slice,第二个参数是源 slice,两个 slice 可以共享同一个底层数组

  • 不会新开辟一块内存区域去存放临时需要拷贝的数组

切片引用和复制再内存层面上的影响

package main

import "fmt"

func main() {
//设置元素数量
const elementNumbers = 1000

//使用make()方法预分配足够多的切片
srcData := make([]int, elementNumbers)

//将数组赋值
for i := 0; i < elementNumbers; i++ {
srcData[i] = i+1
}

//打印出切片来看看
//for i, j := range srcData {
// fmt.Printf("第%d号索引的值是%d ", i, j)
//}

//引用切片数据
refData := srcData

//使用make预分配切片
copyData := make([]int, elementNumbers)

//使用copy内置函数复制src给copy
copy(copyData, srcData)

//修改第一个元素
srcData[0] = 999

srcData[1] = 888

//打印引用切片的第一个元素
fmt.Println(refData[1])

copyData[0] = 777

//打印第一个和最后一个元素
fmt.Println(copyData[0], copyData[elementNumbers-1])

srcData[4] = 444

srcData[5] = 666

// 复制原始数据从4到6(不包含)
copy(copyData, srcData[4:6])

for i := 0; i < 5; i++ {
fmt.Printf("%d", copyData[i])
}
/*
       引用的话源切片和目的切片的内存地址指向的连续内存区域是一样的
       改变源切片的元素目的切片也会对应的改变
       复制的话原切片和目的切片的内存地址指向的连续内存区域是不一样的
       复制是新开辟出一块区域
*/
}

 

It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/15187941.html