go中slice淺拷貝和深拷貝的實現(xiàn)
淺拷貝(Shallow Copy)
淺拷貝是指只復(fù)制切片本身的結(jié)構(gòu)(指針、長度和容量),而不復(fù)制底層數(shù)組的元素。
實現(xiàn)方式
直接賦值:
slice1 := []int{1, 2, 3} slice2 := slice1 // 淺拷貝切片操作:
slice1 := []int{1, 2, 3} slice2 := slice1[:] // 淺拷貝
特點
- 新切片和原切片共享同一個底層數(shù)組
- 修改一個切片的元素會影響另一個切片
- 內(nèi)存效率高,因為不需要復(fù)制底層數(shù)據(jù)
示例
package main
import "fmt"
func main() {
original := []int{1, 2, 3}
copy := original // 淺拷貝
copy[0] = 100
fmt.Println(original) // [100 2 3]
fmt.Println(copy) // [100 2 3]
}
深拷貝(Deep Copy)
深拷貝是指創(chuàng)建一個新的切片,并且復(fù)制底層數(shù)組的所有元素。
實現(xiàn)方式
使用copy函數(shù):
slice1 := []int{1, 2, 3} slice2 := make([]int, len(slice1)) copy(slice2, slice1) // 深拷貝使用append(需要先創(chuàng)建一個空切片):
slice1 := []int{1, 2, 3} slice2 := append([]int{}, slice1...) // 深拷貝
特點
- 新切片有自己的底層數(shù)組
- 修改一個切片的元素不會影響另一個切片
- 內(nèi)存消耗更大,因為需要復(fù)制所有數(shù)據(jù)
示例
package main
import "fmt"
func main() {
original := []int{1, 2, 3}
copy := make([]int, len(original))
copy(copy, original) // 深拷貝
copy[0] = 100
fmt.Println(original) // [1 2 3]
fmt.Println(copy) // [100 2 3]
}
注意事項
copy函數(shù)的行為:
- 如果目標切片長度小于源切片,只會復(fù)制目標切片長度的元素
- 如果目標切片長度大于源切片,多余的元素保持不變
多維切片的拷貝:
- 對于多維切片,
copy函數(shù)或append只能實現(xiàn)第一層的深拷貝 - 內(nèi)層切片仍然是淺拷貝,需要遞歸處理才能實現(xiàn)完全深拷貝
- 對于多維切片,
性能考慮:
- 淺拷貝更快且內(nèi)存效率更高
- 深拷貝更安全但消耗更多資源
總結(jié)
| 特性 | 淺拷貝 | 深拷貝 |
|---|---|---|
| 實現(xiàn)方式 | 直接賦值或切片操作 | copy函數(shù)或append |
| 底層數(shù)組 | 共享 | 獨立 |
| 修改影響 | 互相影響 | 互不影響 |
| 內(nèi)存消耗 | 低 | 高 |
| 適用場景 | 不需要獨立修改或關(guān)注性能的場景 | 需要獨立修改或確保數(shù)據(jù)安全的場景 |
到此這篇關(guān)于go中slice淺拷貝和深拷貝的實現(xiàn)的文章就介紹到這了,更多相關(guān)go slice淺拷貝和深拷貝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GO語言中創(chuàng)建切片的三種實現(xiàn)方式
這篇文章主要介紹了GO語言中創(chuàng)建切片的三種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
go Antlr重構(gòu)腳本解釋器實現(xiàn)示例
這篇文章主要為大家介紹了go Antlr重構(gòu)腳本解釋器實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
Go語言學(xué)習(xí)之函數(shù)的定義與使用詳解
這篇文章主要為大家詳細介紹Go語言中函數(shù)的定義與使用,文中的示例代碼講解詳細,對我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下2022-04-04

