<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Go語言的內建函數 copy() 可以將一個陣列切片複製到另一個陣列切片中,如果加入的兩個陣列切片不一樣大,就會按照其中較小的那個陣列切片的元素個數進行復制。
copy() 函數的使用格式如下:
copy( destSlice, srcSlice []T) int
其中 srcSlice 為資料來源切片,destSlice 為複製的目標(也就是將 srcSlice 複製到 destSlice),目標切片必須分配過空間且足夠承載複製的元素個數,並且來源和目標的型別必須一致,copy() 函數的返回值表示實際發生複製的元素個數。
下面的程式碼展示了使用 copy() 函數將一個切片複製到另一個切片的過程:
slice1 := []int{1, 2, 3, 4, 5} slice2 := []int{5, 4, 3} copy(slice2, slice1) // 只會複製slice1的前3個元素到slice2中 copy(slice1, slice2) // 只會複製slice2的3個元素到slice1的前3個位置
雖然通過迴圈複製切片元素更直接,不過內建的 copy() 函數使用起來更加方便,copy() 函數的第一個引數是要複製的目標 slice,第二個引數是源 slice,兩個 slice 可以共用同一個底層陣列,甚至有重疊也沒有問題。
【範例】通過程式碼演示對切片的參照和複製操作後對切片元素的影響。
package main import "fmt" func main() { // 設定元素數量為1000 const elementCount = 1000 // 預分配足夠多的元素切片 srcData := make([]int, elementCount) // 將切片賦值 for i := 0; i < elementCount; i++ { srcData[i] = i } // 參照切片資料 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++ { fmt.Printf("%d ", copyData[i]) } }
程式碼說明如下:
package main import "fmt" //Go語言並沒有對刪除切片元素提供專用的語法或者介面,需要使用切片本身的特性來刪除元素, //Go語言中刪除切片元素的本質是,以被刪除元素為分界點,將前後兩個部分的記憶體重新連線起來。 // 根據要刪除元素的位置有三種情況,分別是從開頭位置刪除、從中間位置刪除和從尾部刪除,其中刪除切片尾部的元素速度最快。 func main() { //用=號的話必須先var宣告 var a [] int a=[]int{4,5,6} fmt.Println(a) //[4 5 6] //用:=是宣告並賦值,並且系統自動判斷型別,不需要var關鍵字 b:=[]int{7,8,9} fmt.Println(b) //[7 8 9] //1.利用切片的特性來刪除元素 a=a[1:] //取索引1以後的值(包含索引1)即刪除a[0] //a=a[N:] //刪除開頭n個元素 fmt.Println(a) //[5 6] //2.也可以不行動資料指標,但是將後面的資料向開頭移動,可以用 append 原地完成 // 所謂原地完成是指在原有的切片資料對應的記憶體區間內完成,不會導致記憶體空間結構的變化: fmt.Println(a[:0]) //取到a[0]結尾且不包含a[0],即為[] a = append(a[:0],a[1:]...)//在尾部追加a[1:],即a[n:]刪除前n個元素 fmt.Println(a) //[6] //3.copy()函數刪除元素 //copy把b[1:]複製給b,返回複製後的len(b),多此一舉,和b[1:]結果一樣 b=b[:copy(b,b[1:])] fmt.Println(b) //[8 9] //4.從中間位置刪除 //對於刪除中間的元素,需要對剩餘的元素進行一次整體挪動,同樣可以用append或copy原地完成 //append操作 c:=[]int{1,2,3,4,5} //c=append(c[:i],c[i+1:]...) 刪除中間一個元素:(c[i]) //c=append(c[:i],c[i+N:]...) 刪除中間N個元素:(c[i:I+N-1]) //先取c[:1]之前的資料,在追加c[2:]之後的資料,即刪除c[1] c=append(c[:1],c[2:]...) fmt.Println(c) //[1 3 4 5] //copy操作 d:=[]int{1,2,3,4,5} //d=d[:i+copy(d[i:],d[i+1:])] 刪除中間一個元素(d[i]),因為從d[i:]開始的,所以i是之前元素的個數 //d=d[:i+copy(d[i:],d[i+N:])] 刪除中間N個元素 //先將d[2:]之後的資料copy給d[1:]之後的資料,即刪除了d[1]資料,並返回len(d[2:]),再連線d[1]之前的資料 d=d[:1+copy(d[1:],d[2:])] //刪除中間一個元素(d[1]) fmt.Println(d)//[1 3 4 5] //5.從尾部刪除 g:=[]int{1,2,3,4} g=g[:len(g)-1] //刪除尾部一個元素 //g=g[:len(g)-N] //刪除尾部N個元素 fmt.Println(g) //[1 2 3] index() } //刪除切片指定位置的元素 func index() { str:=[]string{"a","b","c","d"} //指定刪除索引 index:=2 //檢視刪除索引之前的元素,刪除索引之後的元素 fmt.Println(str[:index],str[index+1:]) //[a b] [d] //將刪除點前後元素連線起來 str=append(str[:index],str[index+1:]...) fmt.Println(str) //[a b d]
到此這篇關於Go語言copy()實現切片複製的文章就介紹到這了,更多相關Go 切片複製內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45