Go 基础面试题, Go 语言中,什么是 slice 的深拷贝和浅拷贝?
Go 基础面试题, Go 语言中,什么是 slice 的深拷贝和浅拷贝?
QA
Step 1
Q:: 什么是 Go 语言中的 slice?
A:: 在 Go 语言中,slice 是一种动态数组,它是对底层数组的一个视图。slice 不保存具体的数据,而是保存对底层数组的引用。slice 有三个属性:长度、容量和底层数组指针。长度是当前 slice 中包含的元素个数,容量是从 slice 的起始位置到底层数组末尾之间的元素个数。
Step 2
Q:: Go 语言中,什么是 slice 的浅拷贝?
A:: slice 的浅拷贝指的是直接复制 slice 的引用,这意味着新的 slice 共享底层数组的内存地址。修改其中一个 slice 的元素会影响另一个 slice,因为它们指向相同的底层数组。浅拷贝的操作通常通过直接赋值完成,比如 newSlice := oldSlice
。
Step 3
Q:: Go 语言中,什么是 slice 的深拷贝?
A:: slice 的深拷贝指的是复制 slice 中的元素到一个新的底层数组,从而两个 slice 互相独立。新 slice 拥有自己的底层数组,修改其中一个 slice 的元素不会影响另一个 slice。深拷贝可以通过手动复制元素实现,比如使用 copy()
函数:newSlice := make([]int, len(oldSlice)); copy(newSlice, oldSlice)
。
Step 4
Q:: 如何实现 slice 的深拷贝?
A:: 实现 slice 的深拷贝可以通过使用 Go 的 copy()
函数。首先,需要创建一个新的 slice,并指定其长度等于要复制的 slice 的长度。然后,使用 copy()
函数将原 slice 的元素复制到新的 slice。例如:newSlice := make([]int, len(oldSlice)); copy(newSlice, oldSlice)
。这样,newSlice
和 oldSlice
拥有独立的底层数组。
Step 5
Q:: 什么时候需要使用 slice 的深拷贝?
A:: 当你需要创建一个独立的副本以免修改原始 slice 的内容时,需要使用深拷贝。例如,在并发程序中,如果多个 goroutine 需要对同一 slice 的数据进行修改,深拷贝可以避免数据竞争和不确定性行为。