3 5 Go語言copy 切片複製(切片拷貝)

2021-10-05 22:08:25 字數 1859 閱讀 2259

go語言的內建函式 copy() 可以將乙個陣列切片複製到另乙個陣列切片中,如果加入的兩個陣列切片不一樣大,就會按照其中較小的那個陣列切片的元素個數進行複製。

copy() 函式的使用格式如下:

copy

( destslice, srcslice [

]t)int

其中 srcslice 為資料**切片,destslice 為複製的目標(也就是將 srcslice 複製到 destslice),目標切片必須分配過空間且足夠承載複製的元素個數,並且**和目標的型別必須一致,copy() 函式的返回值表示實際發生複製的元素個數。

下面的**展示了使用 copy() 函式將乙個切片複製到另乙個切片的過程:

slice1 :=

intslice2 :=

intcopy

(slice2, slice1)

// 只會複製slice1的前3個元素到slice2中

copy

(slice1, slice2)

// 只會複製slice2的3個元素到slice1的前3個位置

雖然通過迴圈複製切片元素更直接,不過內建的 copy() 函式使用起來更加方便,copy() 函式的第乙個引數是要複製的目標 slice,第二個引數是源 slice,兩個 slice 可以共享同乙個底層陣列,甚至有重疊也沒有問題。

【示例】通過**演示對切片的引用和複製操作後對切片元素的影響。

package main

import

"fmt"

func

main()

// 引用切片資料

refdata := srcdata

// 預分配足夠多的元素切片

copydata :=

make([

]int

, elementcount)

// 將資料複製到新的切片空間中

copy

(copydata, srcdata)

// 修改原始資料的第乙個元素

srcdata[0]

=999

// 列印引用切片的第乙個元素

fmt.

println

(refdata[0]

)// 列印複製切片的第乙個和最後乙個元素

fmt.

println

(copydata[0]

, copydata[elementcount-1]

)// 複製原始資料從4到6(不包含)

copy

(copydata, srcdata[4:

6])for i :=

0; i <

5; i++

}

**說明如下:

第 8 行,定義元素總量為 1000。

第 11 行,預分配擁有 1000 個元素的整型切片,這個切片將作為原始資料。

第 14~16 行,將 srcdata 填充 0~999 的整型值。

第 19 行,將 refdata 引用 srcdata,切片不會因為等號操作進行元素的複製。

第 22 行,預分配與 srcdata 等大(大小相等)、同型別的切片 copydata。

第 24 行,使用 copy() 函式將原始資料複製到 copydata 切片空間中。

第 27 行,修改原始資料的第乙個元素為 999。

第 30 行,引用資料的第乙個元素將會發生變化。

第 33 行,列印複製資料的首位資料,由於資料是複製的,因此不會發生變化。

第 36 行,將 srcdata 的區域性資料複製到 copydata 中。

第 38~40 行,列印複製區域性資料後的 copydata 元素。

Go語言切片

go語言切片 go語言切片是對陣列的抽象 go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,go中提供了一種靈活,功能強悍的內建型別切片 動態陣列 與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。宣告乙個未指定大小的陣列來定義切片 var identifier ...

go語言 切片

一 概述 low 陣列下標的起點 high 陣列下標的結束點 不包括此點 arr low arr high len 長度 high low cap 容量 max low 二 切片的長度與容量 package main import fmt func main slice arr 0 3 5 fmt....

Go語言 切片

因為陣列的長度是固定的並且陣列長度屬於型別的一部分,所以陣列有很多的侷限性。例如 func arraysum x 3 int int return sum 這個求和函式只能接受 3 int型別,其他的都不支援。再比如,a 3 int陣列a中已經有三個元素了,我們不能再繼續往陣列a中新增新元素了。切片...