Go 語言中陣列按值和按引用複製到另一個數組


在 Go 語言中,陣列是固定大小的資料結構,用於儲存相同型別的一組值。在某些情況下,可能需要將一個數組複製到另一個數組,無論是按值還是按引用。在本文中,我們將探討如何在 Go 語言中按值和按引用複製陣列。

Go 語言中按值複製陣列

在 Go 語言中,當您將一個數組賦值給另一個變數或將其作為引數傳遞給函式時,它是按值複製的。這意味著對複製陣列所做的任何更改都不會影響原始陣列。要按值複製陣列,您可以簡單地將其賦值給一個新變數。

示例

以下是在 Go 語言中按值複製陣列的示例:

package main

import "fmt"

func main() {
   arr1 := [3]int{1, 2, 3}
   arr2 := arr1 // copying arr1 by value to arr2
   arr2[0] = 0  // modifying the first element of arr2

   fmt.Println(arr1) // prints [1 2 3]
   fmt.Println(arr2) // prints [0 2 3]
}

輸出

[1 2 3]
[0 2 3]

在上面的示例中,我們建立了一個包含三個元素的陣列 arr1,並將其按值賦值給 arr2。然後,我們將 arr2 的第一個元素修改為 0。但是,此修改沒有影響 arr1,因為它是由值複製的。

Go 語言中按引用複製陣列

在 Go 語言中,當陣列作為切片傳遞給函式時,它們是按引用複製的。切片是陣列元素的動態大小、靈活的檢視。當您將陣列作為切片傳遞給函式時,它是按引用傳遞的,這意味著對切片所做的任何更改也會影響原始陣列。

示例

以下是在 Go 語言中按引用複製陣列的示例:

package main

import "fmt"

func modifySlice(s []int) {
   s[0] = 0 // modifying the first element of s
}

func main() {
   arr1 := [3]int{1, 2, 3}
   slice1 := arr1[:] // creating a slice from arr1
   modifySlice(slice1) // passing slice1 to modifySlice function

   fmt.Println(arr1) // prints [0 2 3]
   fmt.Println(slice1) // prints [0 2 3]
}

輸出

[0 2 3]
[0 2 3]

在上面的示例中,我們建立了一個包含三個元素的陣列 arr1,並從中建立了一個切片 slice1。然後,我們將 slice1 傳遞給 modifySlice 函式,該函式將 slice1 的第一個元素修改為 0。由於 slice1 是由 arr1 按引用建立的,因此此修改也影響了 arr1。

Go 語言中複製陣列的一部分

在 Go 語言中,您還可以使用 copy 函式將陣列或切片的一部分複製到另一個數組或切片。copy 函式接受兩個引數:目標陣列或切片和源陣列或切片。然後,它將元素從源複製到目標。

示例

以下是在 Go 語言中複製陣列一部分的示例:

package main

import "fmt"

func main() {
   arr1 := [5]int{1, 2, 3, 4, 5}
   arr2 := [3]int{} // creating an empty array of length 3
   slice1 := arr1[1:4] // creating a slice from arr1

   copy(arr2[:], slice1)
   fmt.Println("arr1: ", arr1)
   fmt.Println("arr2: ", arr2)
   fmt.Println("slice1: ", slice1)
}

輸出

arr1:  [1 2 3 4 5]
arr2:  [2 3 4]
slice1:  [2 3 4]

在此示例中,我們首先建立一個包含 5 個元素的陣列 arr1。然後,我們建立一個長度為 3 的空陣列 arr2。我們還從 arr1 建立了一個切片 slice1,其中包含從索引 1 到 3 的元素(不包括索引 3 處的元素)。

然後,我們使用 copy() 函式將 slice1 複製到 arr2 中。由於 arr2 的長度為 3,因此只有 slice1 的前 3 個元素被複制到其中。

最後,我們列印 arr1、arr2 和 slice1 的內容,以驗證複製是否成功。

在輸出中,我們可以看到 arr2 包含元素 [2 3 4],這些元素是從 slice1 複製的。

結論

陣列是 Go 語言中重要的資料結構,瞭解如何按值和按引用複製它們對於任何使用陣列的開發人員來說都是必不可少的。瞭解按值複製陣列和按引用複製陣列之間的區別非常重要,因為它們具有不同的含義和用例。按值複製陣列會建立陣列的新副本,而按引用複製則會建立對同一底層陣列的新引用。此外,開發人員還應該熟悉如何使用內建的 copy() 函式將陣列的一部分複製到另一個數組中。使用這些技術,開發人員可以有效地使用 Go 語言中的陣列並建立高效且可靠的程式碼。

更新於: 2023-04-07

3K+ 瀏覽量

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告