go内置函数copy
- go 内置函数copy()
- 函数说明:
- 代码例子1:
- 代码例子2:
- 代码例子3:
go 内置函数copy()
函数说明:
当我们在Go语言中需要将一个切片的内容复制到另一个切片时,可以使用内置的copy()
函数。copy()
函数用于将源切片中的元素复制到目标切片中,它有以下形式的签名:
func copy(dst, src []T) int
其中,dst
是目标切片,src
是源切片,T
是切片元素的类型。函数返回一个整数值,表示实际复制的元素个数(即src
和dst
的最小长度)。
注意以下几点关于copy()
函数的行为:
-
dst
和src
的底层数组必须是相同类型的。例如,不能将一个[]int
类型的切片复制到一个[]string
类型的切片中。 -
copy()
函数不会对切片本身进行初始化,所以在使用copy()
之前,必须确保目标切片dst
已经初始化。 -
copy()
不会自动扩容:copy()
函数只会复制dst
切片能容纳的元素数量,如果dst
的容量不足以容纳src
的所有元素,多余的元素将被丢弃。如果需要将src
切片的所有元素复制到dst
切片中,并且确保dst
具有足够的容量,需要在复制前先对dst
进行扩容。可以使用append()
函数来实现切片的扩容,然后再调用copy()
函数进行复制。 -
copy()
函数会将src
中的元素逐个复制到dst
,不会对切片进行扩容或缩容。 -
copy()
函数不会创建新的切片,它只是修改目标切片的内容。
代码例子1:
下面是一个使用copy()
函数的例子:
package main
import "fmt"
func main() {
// 源切片
sourceSlice := []int{1, 2, 3, 4, 5}
// 目标切片
destinationSlice := make([]int, len(sourceSlice))
// 使用copy函数复制源切片到目标切片
numCopied := copy(destinationSlice, sourceSlice)
// 打印结果
fmt.Println("Source slice:", sourceSlice)
fmt.Println("Destination slice:", destinationSlice)
fmt.Println("Number of elements copied:", numCopied)
}
输出结果可能如下所示:
Source slice: [1 2 3 4 5]
Destination slice: [1 2 3 4 5]
Number of elements copied: 5
在这个例子中,我们首先创建了一个名为sourceSlice
的切片,然后使用make
函数创建了一个和sourceSlice
相同长度的目标切片destinationSlice
。接着,我们使用copy()
函数将sourceSlice
中的元素复制到destinationSlice
,并打印了两个切片的内容和复制的元素个数。
需要注意的是,copy()
函数不会影响源切片的内容,它只是将源切片中的元素复制到目标切片中,因此修改目标切片不会影响源切片。
代码例子2:
package main
import "fmt"
func main() {
// 示例1
sourceSlice := []int{1, 2, 3, 4, 5}
destinationSlice := make([]int, len(sourceSlice))
numCopied := copy(destinationSlice, sourceSlice)
fmt.Println("Copied elements:", numCopied) // Output: Copied elements: 5
fmt.Println("Destination slice:", destinationSlice) // Output: Destination slice: [1 2 3 4 5]
// 示例2
sourceSlice2 := []string{"apple", "banana", "orange"}
destinationSlice2 := make([]string, 2)
numCopied2 := copy(destinationSlice2, sourceSlice2)
fmt.Println("Copied elements:", numCopied2) // Output: Copied elements: 2
fmt.Println("Destination slice:", destinationSlice2) // Output: Destination slice: [apple banana]
}
在示例1中,我们将整数切片 sourceSlice
复制到 destinationSlice
中,destinationSlice
的长度和 sourceSlice
相同,所以所有元素都被复制。在示例2中,源切片 sourceSlice2
的长度为3,目标切片 destinationSlice2
的长度为2,只有2个元素被复制。
代码例子3:
在Go语言中,使用copy
函数复制一个切片后,新旧切片是独立的,它们拥有不同的内存地址,没有关联。复制操作会创建一个新的切片,并将原始切片中的元素复制到新切片中,新切片和原始切片指向不同的底层数组。
让我们通过一个例子来说明这个情况:
package main
import "fmt"
func main() {
// 原始切片
originalSlice := []int{1, 2, 3, 4, 5}
// 复制切片
copiedSlice := make([]int, len(originalSlice))
copy(copiedSlice, originalSlice)
// 打印原始切片和复制切片的地址
fmt.Printf("Address of originalSlice: %p\n", originalSlice)
fmt.Printf("Address of copiedSlice: %p\n", copiedSlice)
}
输出结果可能如下所示:
Address of originalSlice: 0xc0000b2000
Address of copiedSlice: 0xc0000b2080
在这个例子中,我们创建了一个名为originalSlice
的切片,并使用make
函数创建了一个新的切片copiedSlice
,然后使用copy
函数将originalSlice
的元素复制到copiedSlice
。接着,我们打印了originalSlice
和copiedSlice
的地址。
可以看到,originalSlice
和copiedSlice
的地址是不同的,这表明它们分别指向不同的底层数组,没有共享内存。文章来源:https://uudwc.com/A/0rxEa
因此,通过copy
函数复制切片后,新切片和原始切片是完全独立的,修改新切片不会影响原始切片,它们之间没有关联。文章来源地址https://uudwc.com/A/0rxEa