Golang 拷貝Array或Slice

Golang 拷貝Array或Slice

Golang中Array是值類型而slice是引用類型。因此兩者之間的賦值或拷貝有些差異,本文帶你瞭解各自的差異。

1. 拷貝array

前面提及數組是值類型,所以數組變量名不是指向第一個元素的指針。事實上它表示整個數組,下面兩者情況將自動創建數組:

  • 數組變量賦值給另一個數組變量
  • 數組變量傳遞作爲函數參數

請看示例:

package main

import "fmt"

func main() {
    sample1 := [2]string{"a", "b"}
    fmt.Printf("Sample1 Before: %v\n", sample1)
    sample2 := sample1
    sample2[0] = "c"
    fmt.Printf("Sample1 After assignment: %v\n", sample1)
    fmt.Printf("Sample2: %v\n", sample2)
    test(sample1)
    fmt.Printf("Sample1 After Test Function Call: %v\n", sample1)
}
func test(sample [2]string) {
    sample[0] = "d"
    fmt.Printf("Sample in Test function: %v\n", sample)
}

輸出結果:

Sample1 Before: [a b]
Sample1 After assignment: [a b]
Sample2: 
Sample in Test function: [d b]
Sample1 After Test Function Call: [a b]

我們稍作解釋:

  • sample1 賦給 sample2 ,然後修改sample2中第一個元素。打印sample1驗證是否有影響,當然沒有改變。這是因爲sample1 賦給 sample2,會創建sample1的拷貝給sample2,故修改sample2不影響sample1.

  • 傳遞sample1給test函數,然後在函數體內修改其第一個元素。之後打印sample1驗證是否有影響,當然也沒有。原因是一樣的,當sample1作爲參數傳遞給test時,sample1的拷貝被創建並傳入,因此修改不會影響原來sample1.

2. 拷貝slice

Golang內置包提供copy函數能夠拷貝slice,函數前面如下,其返回拷貝元素個數:

func copy(dst, src []Type) int

使用copy函數需要考慮兩種情況:

  • 如果src長度大於dst,那麼僅拷貝dst長度個元素

  • 如果dst長度大於src,那麼僅拷貝src長度個元素

總結爲拷貝兩者最小長度元素:min(src,dst)

需要注意的是,一旦拷貝完成,對目標的修改不會影響源,反之亦然。
我們也通過示例說明:

package main

import "fmt"

func main() {
    src := []int{1, 2, 3, 4, 5}
    dst := make([]int, 5)

    numberOfElementsCopied := copy(dst, src)
    fmt.Printf("Number Of Elements Copied: %d\n", numberOfElementsCopied)
    fmt.Printf("dst: %v\n", dst)
    fmt.Printf("src: %v\n", src)

    //After changing numbers2
    dst[0] = 10
    fmt.Println("\nAfter changing dst")
    fmt.Printf("dst: %v\n", dst)
    fmt.Printf("src: %v\n", src)
}

輸出如下:

Number Of Elements Copied: 5
dst: [1 2 3 4 5]
src: [1 2 3 4 5]

After changing dst
dst: [10 2 3 4 5]
src: [1 2 3 4 5]

3. 總結

本文介紹了Go Array和Slice直接拷貝。Array是值類型直接賦值即拷貝,Slice是引用類型,直接賦值是指針會影響源Slice,但可以通過內置copy函數實現賦值功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章