溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Golang切片和數(shù)組拷貝應(yīng)用的方法是什么

發(fā)布時(shí)間:2023-04-21 11:33:05 來源:億速云 閱讀:95 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Golang切片和數(shù)組拷貝應(yīng)用的方法是什么”,在日常操作中,相信很多人在Golang切片和數(shù)組拷貝應(yīng)用的方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Golang切片和數(shù)組拷貝應(yīng)用的方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

    golang切片和數(shù)組拷貝

    基礎(chǔ)

    Go 語言里面變量有兩類,一類是值類型,一類是引用類型。

    在 Go 語言中:
    string、int、bool、float 等這些都屬于值類型
    slice、map、chan 等這些都屬于引用類型

    什么是淺拷貝和深拷貝?

    我們提到的深拷貝和淺拷貝,則指的是引用類型的值處理方案。
    淺拷貝指的是,把變量里面存的內(nèi)存地址拷貝了,所指向的真實(shí)值并沒拷貝。

    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ù)組需要指定大小,不指定也會(huì)根據(jù)初始化的自動(dòng)推算出大小,不可改變。
    切片不需要指定大小。切片長度是可以改變。

    數(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默認(rèn)都是采用值傳遞,即拷貝傳遞,也就是深拷貝。 只有一些特定的類型,如slice、map、channel、function、pointer這些天生就是指針的類型,是通過引用傳遞的。(切片是引用傳遞,數(shù)組是值傳遞)切片和數(shù)組的區(qū)別。

    總結(jié): 1、golang默認(rèn)是值傳遞,即拷貝傳遞;
    2、有些值天生就是指針,如(切片,map類型)

    golang數(shù)組拷貝

    默認(rèn)情況下Golang的數(shù)組傳遞是值傳遞,但當(dāng)我們想要對傳入的數(shù)組進(jìn)行修改時(shí),可以使用指針來對數(shù)組進(jìn)行操作,如下:

    func main() {
       arr := [3]int{1, 2, 3}
       arr2 := arr
       arr3 := &arr
       fmt.Printf("原數(shù)組:%v \n", arr)
       fmt.Printf("賦值方式復(fù)制的數(shù)組:%v \n", arr2)
       fmt.Printf("引用方式復(fù)制的數(shù)組:%v \n", *arr3)
       arr[1] = 1000
       fmt.Printf("改變后原數(shù)組:%v \n", arr)
       fmt.Printf("改變后賦值方式復(fù)制的數(shù)組:%v \n", arr2)
       fmt.Printf("改變后引用方式復(fù)制的數(shù)組:%v \n", *arr3)
    }

    Golang切片和數(shù)組拷貝應(yīng)用的方法是什么

    arr2獲得的是arr的數(shù)據(jù)副本,也就是說賦值方式是復(fù)制了原數(shù)組的底層數(shù)據(jù);

    而arr3獲得的是arr地址的副本,即引用賦值的方式復(fù)制的是地址,這個(gè)地址指向的還是原來的數(shù)據(jù)。

    golang切片拷貝

    copy復(fù)制會(huì)比等號復(fù)制慢。但是copy復(fù)制為值復(fù)制,改變原切片的值不會(huì)影響新切片。而等號復(fù)制為指針復(fù)制,改變原切片或新切片都會(huì)對另一個(gè)產(chǎn)生影響。

    由于切片是引用類型。但自身是結(jié)構(gòu)體,值拷貝傳遞。如果直接使用 target:=source 那么操作target也會(huì)影響source數(shù)值。

    target:= make([]int, len(source))
    copy(target, source)

    到此,關(guān)于“Golang切片和數(shù)組拷貝應(yīng)用的方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI