Golang切片和數(shù)組拷貝詳解(淺拷貝和深拷貝)
golang切片和數(shù)組拷貝
基礎
Go 語言里面變量有兩類,一類是值類型,一類是引用類型。
在 Go 語言中:
string、int、bool、float 等這些都屬于值類型
slice、map、chan 等這些都屬于引用類型
什么是淺拷貝和深拷貝?
我們提到的深拷貝和淺拷貝,則指的是引用類型的值處理方案。
淺拷貝指的是,把變量里面存的內存地址拷貝了,所指向的真實值并沒拷貝。
golang數(shù)組和切片的區(qū)別
1、定義方式不一樣
數(shù)組定義:
var a1 [3]int var a2 [...]int{1,2,3}
切片定義
var b1 []int b2 := make([]int, 3, 5)
2、初始化方法不一樣:
數(shù)組需要指定大小,不指定也會根據(jù)初始化的自動推算出大小,不可改變。
切片不需要指定大小。切片長度是可以改變。
數(shù)組初始化
a := [3]int{1,2,3} //指定長度 a := [...]int{1,2,3} //不指定長度
切片初始化
s := make([]int, 3) //指定長度 s := []int{1,2,3} //不指定長度
3、函數(shù)傳遞方式不同:數(shù)組是值傳遞,切片是地址傳遞。
數(shù)組是值類型,數(shù)組傳遞是值。切片是引用類型,切片傳遞是指針
4、切片通過append添加元素
數(shù)組不能使用append
Golang中的值傳遞和引用傳遞
golang默認都是采用值傳遞,即拷貝傳遞,也就是深拷貝。 只有一些特定的類型,如slice、map、channel、function、pointer這些天生就是指針的類型,是通過引用傳遞的。(切片是引用傳遞,數(shù)組是值傳遞)切片和數(shù)組的區(qū)別。
總結: 1、golang默認是值傳遞,即拷貝傳遞;
2、有些值天生就是指針,如(切片,map類型)
golang數(shù)組拷貝
默認情況下Golang的數(shù)組傳遞是值傳遞,但當我們想要對傳入的數(shù)組進行修改時,可以使用指針來對數(shù)組進行操作,如下:
func main() { arr := [3]int{1, 2, 3} arr2 := arr arr3 := &arr fmt.Printf("原數(shù)組:%v \n", arr) fmt.Printf("賦值方式復制的數(shù)組:%v \n", arr2) fmt.Printf("引用方式復制的數(shù)組:%v \n", *arr3) arr[1] = 1000 fmt.Printf("改變后原數(shù)組:%v \n", arr) fmt.Printf("改變后賦值方式復制的數(shù)組:%v \n", arr2) fmt.Printf("改變后引用方式復制的數(shù)組:%v \n", *arr3) }
arr2獲得的是arr的數(shù)據(jù)副本,也就是說賦值方式是復制了原數(shù)組的底層數(shù)據(jù);
而arr3獲得的是arr地址的副本,即引用賦值的方式復制的是地址,這個地址指向的還是原來的數(shù)據(jù)。
golang切片拷貝
copy復制會比等號復制慢。但是copy復制為值復制,改變原切片的值不會影響新切片。而等號復制為指針復制,改變原切片或新切片都會對另一個產生影響。
由于切片是引用類型。但自身是結構體,值拷貝傳遞。如果直接使用 target:=source 那么操作target也會影響source數(shù)值。
target:= make([]int, len(source)) copy(target, source)
數(shù)組和切片拷貝總結
針對需要復制拷貝:
- 如果復制數(shù)組,可以直接通過賦值進行復制;
- 如果復制切片,可以直接使用copy();
到此這篇關于Golang切片和數(shù)組拷貝詳解的文章就介紹到這了,更多相關golang切片和數(shù)組拷貝內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Go語言中如何通過Goroutine實現(xiàn)高并發(fā)
在Go語言中,并發(fā)編程是一個核心且強大的特性,Go語言通過goroutine和channel等機制,使得并發(fā)編程變得更加簡單和直觀,本文給大家介紹了Go語言中如何通過Goroutine快速實現(xiàn)高并發(fā),感興趣的小伙伴跟著小編一起來看看吧2024-10-10