在Golang中钻洒,數(shù)組是值類型而切片是引用類型酗昼。因此值的復(fù)制與切片的復(fù)制并不相同。
數(shù)組的復(fù)制
對(duì)于值類型的數(shù)組來說闺骚,變量指向的并不是第一個(gè)元素的指針彩扔,而是整個(gè)數(shù)組。以下情況會(huì)發(fā)生數(shù)組的復(fù)制:
- 將數(shù)組變量賦值給另一個(gè)數(shù)組變量
- 將數(shù)組變量作為參數(shù)傳遞給方法
舉個(gè)栗子:
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: [c b]
Sample in Test function: [d b]
Sample1 After Test Function Call: [a b]
在上例中僻爽,
- 將simple1賦值給simple2后虫碉,修改simple2的第一個(gè)元素,simple1的值并沒有改變胸梆。因?yàn)閿?shù)組的復(fù)制是值復(fù)制敦捧,simple2的修改并不會(huì)對(duì)simple1產(chǎn)生影響
- 將simple1作為參數(shù)傳遞給test方法,在方法中修改數(shù)組第一個(gè)元素碰镜。simple1的值同樣不會(huì)被改變兢卵。因?yàn)閿?shù)組作為參數(shù)傳入方法時(shí)發(fā)生了值復(fù)制。
切片的復(fù)制
golang的builtin
包提供的copy
方法可以用來復(fù)制切片绪颖。該方法返回成功復(fù)制元素的個(gè)數(shù)秽荤,簽名如下:
func copy(dst, src []Type) int
被復(fù)制的元素個(gè)數(shù)是dst和src中短的那個(gè)。同時(shí)注意一旦復(fù)制柠横,對(duì)dst的任何修改都不會(huì)影響到src窃款,反之亦然。
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]