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)文章
Golang中多個(gè)線程和多個(gè)協(xié)程的使用區(qū)別小結(jié)
本文主要介紹了Golang中多個(gè)線程和多個(gè)協(xié)程的使用區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-06-06
簡(jiǎn)單高效!Go語言封裝二級(jí)認(rèn)證功能實(shí)現(xiàn)
本文將介紹如何使用Go語言封裝二級(jí)認(rèn)證功能,實(shí)現(xiàn)簡(jiǎn)單高效的用戶認(rèn)證流程,二級(jí)認(rèn)證是一種安全措施,要求用戶在登錄后進(jìn)行額外的身份驗(yàn)證,以提高賬戶安全性,2023-10-10
Go語言中的實(shí)時(shí)交互式編程環(huán)境方式
這篇文章主要介紹了Go語言中的實(shí)時(shí)交互式編程環(huán)境方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-07-07
Golang微服務(wù)框架Kratos實(shí)現(xiàn)Kafka消息隊(duì)列的方法
消息隊(duì)列是大型分布式系統(tǒng)不可缺少的中間件,也是高并發(fā)系統(tǒng)的基石中間件,所以掌握好消息隊(duì)列MQ就變得極其重要,在本文當(dāng)中,您將了解到:什么是消息隊(duì)列?什么是Kafka?怎樣在微服務(wù)框架Kratos當(dāng)中應(yīng)用Kafka進(jìn)行業(yè)務(wù)開發(fā),需要的朋友可以參考下2023-09-09
關(guān)于golang中死鎖的思考與學(xué)習(xí)
本文主要介紹了關(guān)于golang中死鎖的思考與學(xué)習(xí),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Go實(shí)現(xiàn)用戶每日限額的方法(例一天只能領(lǐng)三次福利)
這篇文章主要介紹了Go實(shí)現(xiàn)用戶每日限額的方法(例一天只能領(lǐng)三次福利)2022-01-01
golang之tcp自動(dòng)重連實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猤olang之tcp自動(dòng)重連實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06

