go中slice淺拷貝和深拷貝的實(shí)現(xiàn)
淺拷貝(Shallow Copy)
淺拷貝是指只復(fù)制切片本身的結(jié)構(gòu)(指針、長(zhǎng)度和容量),而不復(fù)制底層數(shù)組的元素。
實(shí)現(xiàn)方式
直接賦值:
slice1 := []int{1, 2, 3} slice2 := slice1 // 淺拷貝切片操作:
slice1 := []int{1, 2, 3} slice2 := slice1[:] // 淺拷貝
特點(diǎn)
- 新切片和原切片共享同一個(gè)底層數(shù)組
- 修改一個(gè)切片的元素會(huì)影響另一個(gè)切片
- 內(nèi)存效率高,因?yàn)椴恍枰獜?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)建一個(gè)新的切片,并且復(fù)制底層數(shù)組的所有元素。
實(shí)現(xiàn)方式
使用copy函數(shù):
slice1 := []int{1, 2, 3} slice2 := make([]int, len(slice1)) copy(slice2, slice1) // 深拷貝使用append(需要先創(chuàng)建一個(gè)空切片):
slice1 := []int{1, 2, 3} slice2 := append([]int{}, slice1...) // 深拷貝
特點(diǎn)
- 新切片有自己的底層數(shù)組
- 修改一個(gè)切片的元素不會(huì)影響另一個(gè)切片
- 內(nèi)存消耗更大,因?yàn)樾枰獜?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]
}
注意事項(xiàng)
copy函數(shù)的行為:
- 如果目標(biāo)切片長(zhǎng)度小于源切片,只會(huì)復(fù)制目標(biāo)切片長(zhǎng)度的元素
- 如果目標(biāo)切片長(zhǎng)度大于源切片,多余的元素保持不變
多維切片的拷貝:
- 對(duì)于多維切片,
copy函數(shù)或append只能實(shí)現(xiàn)第一層的深拷貝 - 內(nèi)層切片仍然是淺拷貝,需要遞歸處理才能實(shí)現(xiàn)完全深拷貝
- 對(duì)于多維切片,
性能考慮:
- 淺拷貝更快且內(nèi)存效率更高
- 深拷貝更安全但消耗更多資源
總結(jié)
| 特性 | 淺拷貝 | 深拷貝 |
|---|---|---|
| 實(shí)現(xiàn)方式 | 直接賦值或切片操作 | copy函數(shù)或append |
| 底層數(shù)組 | 共享 | 獨(dú)立 |
| 修改影響 | 互相影響 | 互不影響 |
| 內(nèi)存消耗 | 低 | 高 |
| 適用場(chǎng)景 | 不需要獨(dú)立修改或關(guān)注性能的場(chǎng)景 | 需要獨(dú)立修改或確保數(shù)據(jù)安全的場(chǎng)景 |
到此這篇關(guān)于go中slice淺拷貝和深拷貝的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)go slice淺拷貝和深拷貝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語(yǔ)言題解LeetCode674最長(zhǎng)連續(xù)遞增序列
這篇文章主要為大家介紹了go語(yǔ)言題解LeetCode674最長(zhǎng)連續(xù)遞增序列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Go語(yǔ)言實(shí)現(xiàn)RSA加解密算法詳解
隨著互聯(lián)網(wǎng)的高速發(fā)展,人們對(duì)安全的要求也越來(lái)越高,加解密也變得越來(lái)越重要,本文主要為大家介紹了Go語(yǔ)言中實(shí)現(xiàn)RSA加解密與簽名驗(yàn)證算法,希望對(duì)大家有所幫助2023-06-06
GO語(yǔ)言中創(chuàng)建切片的三種實(shí)現(xiàn)方式
這篇文章主要介紹了GO語(yǔ)言中創(chuàng)建切片的三種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
go Antlr重構(gòu)腳本解釋器實(shí)現(xiàn)示例
這篇文章主要為大家介紹了go Antlr重構(gòu)腳本解釋器實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Go語(yǔ)言學(xué)習(xí)之函數(shù)的定義與使用詳解
這篇文章主要為大家詳細(xì)介紹Go語(yǔ)言中函數(shù)的定義與使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定幫助,需要的可以參考一下2022-04-04
golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼
這篇文章主要介紹了golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02

