好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Go語言切片前或中間插入項與內置copy()函數詳解

Go語言切片前或中間插入項與內置copy()函數詳解

熱門標簽:電話機器人軟件免費 百度地圖標注后傳給手機 阿克蘇地圖標注 涿州代理外呼系統 外呼系統用什么卡 壽光微信地圖標注 外呼系統顯本地手機號 excel地圖標注分布數據 評價高的400電話辦理

內置append()函數能夠在切片末尾位置添加新的項,假設要在切片的前面或者中間某位置插入特定項,可以這樣實現

看下代碼:

package main
import "fmt"
func main() {
    s := []string{"M","N","O","P","Q","R"}
    x := InsertStringSliceCopy(s,[]string{"a","b","c"},0)
    y := InsertStringSliceCopy(s,[]string{"a","b","c"},3)
    fmt.Printf("%v\n%v\n",x,y)
}
func InsertStringSliceCopy(slice,insertion []string,index int)[]string  {
    result := make([]string,len(slice) + len(insertion))
    at := copy(result,slice[:index])
    at += copy(result[at:],insertion)
    copy(result[at:],slice[index:])
    fmt.Printf("%6T\n",at)
    return result
}

運行結果:

自定義的InsertStringSliceCopy()函數可以實現在切片相應的位置插入項

此外InsertStringSliceCopy()函數中打印類變量at的類型,可知內置函數copy()在實現復制功能的時候會有一個int的返回值

補充:go學習備忘錄 - 切片中間插入元素

1. 通過鏈式append 實現

將多個append操作組合起來,實現在切片中間插入元素:

var a []int
a = append(a[:i], append([]int{1}, a[i:]...)...)     // 在第i個位置插入1
a = append(a[:i], append([]int{1,2,3}, a[i:]...)...) // 在第i個位置插入切片

每個鏈式操作中的第二個append調用都會創建一個臨時切片,并將a[i:]的內容復制到新創建的切片中,然后將臨時創建的切片再追加到a[:i]。

2. 通過copy + append 實現

通過 copy和append組合 可以避免創建中間的臨時切片

a = append(a, 0)     // 切片擴展1個空間
copy(a[i+1:], a[i:]) // a[i:]向后移動1個位置
a[i] = x             // 設置新添加的元素

用copy和append組合在中間位置插入多個元素(也就是插入一個切片):

a = append(a, x...)       // 為x切片擴展足夠的空間
copy(a[i+len(x):], a[i:]) // a[i:]向后移動len(x)個位置
copy(a[i:], x)            // 復制新添加的切片

注:append本質是用于追加元素而不是擴展容量,擴展切片容量只是append的一個副作用。

補充:Go語言中切片作為函數參數,函數中使用append添加元素

切片作為函數,通過append添加元素,有可能會更改地址:

1)添加的數據元素長度超過切片參數的容量,則會另開辟空間,重新分配底層數組,并復制數據。函數中的此切片與原切片地址不同; 此切片指向新開辟的內存。函數運行結束,內存釋放,不會影響元切片的內容。

2)否則原切片與函數中的切片指向同一地址。會影響切片的內容。

3)切片名本身就是一個指針(內容保存指向切片的首地址)

代碼測試:

package main
import "fmt"
func main01() {
 s := make([]int, 3, 5)
 s[2] = 8888
 fmt.Printf("原地址:%p", s)
 s = append(s, 12)
 fmt.Printf("\n添加數據之后的地址:%p", s)
 /*
 append添加元素,容量足夠,則在原基礎之上添加數據,地址不會發生改變
 輸出:
 原地址:0xc04207e030
 添加數據之后的地址:0xc04207e030
 */
}
func main02() {
 s := make([]int, 3)
 s[2] = 666
 fmt.Printf("append添加數據之前的地址:%p", s)
 s = append(s, 888)
 fmt.Printf("\nappend添加數據之后的地址:%p", s)
 
 /*
 append添加數據,容量不夠,則另行開辟空間,切片地址發生變化
 輸出:
 append添加數據之前的地址:0xc04200e2c0
 append添加數據之后的地址:0xc04200a2d0
 */
}
func main() {
 /*
 copy(目的切片,原切片):切片拷貝
 注意事項:目的切片要有足夠的空間,如果沒有空間(切片為空或者指向0x0),不能進行拷貝
           若目的切片容量不足,只拷貝部分(目的切片長度的部分)
 返回值為拷貝成功的切片數量
 */
 s := make([]int, 3)
 s[0] = 0
 s[1] = 111
 s[2] = 666
 //var s1 []int = []int{5: 333}
 //n:=copy(s,s1)
 s1 := make([]int, 1, 2)
 n := copy(s1, s)
 
 fmt.Printf("原切片s的地址是:%p", s)
 fmt.Printf("\n拷貝之后的切片s1的地址是:%p,數量:%d", s1, n)
 fmt.Println(s1)
}

補充說明:

數組和slice之間有著緊密的聯系。一個slice是一個輕量級的數據結構,提供了訪問數組子序列(或者全部)元素的功能,而且slice的底層確實引用一個數組對象。一個slice由三個部分構成:指針、長度和容量。指針指向第一個slice元素對應的底層數組元素的地址,要注意的是slice的第一個元素并不一定就是數組的第一個元素。

切片并不是數組或數組指針,它通過內部指針和相關屬性引⽤數組⽚段,以實現變⻓⽅案。

slice并不是真正意義上的動態數組,而是一個引用類型。slice總是指向一個底層array,slice的聲明也可以像array一樣,只是不需要長度。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • go語言求任意類型切片的長度操作
  • 如何在Go中使用切片容量和長度
  • golang中切片copy復制和等號復制的區別介紹
  • go語言中切片與內存復制 memcpy 的實現操作
  • go語言中的二維切片賦值
  • go語言中切片的長度和容量的區別

標簽:銅川 汕頭 雞西 梅河口 吐魯番 欽州 蘭州 重慶

巨人網絡通訊聲明:本文標題《Go語言切片前或中間插入項與內置copy()函數詳解》,本文關鍵詞  語言,切片,前,或,中間,插入,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go語言切片前或中間插入項與內置copy()函數詳解》相關的同類信息!
  • 本頁收集關于Go語言切片前或中間插入項與內置copy()函數詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 男把女弄出喷水来视频30分钟| 喜爱夜蒲3在线观看| 萌白酱一线天紫薇出白浆| 扒开双腿猛进入18p| 8√天堂资源在线官网| 被粗大jib捣出了白浆H| 在哪里可以免费**| 免费看又爽又黄禁片视频1000| 男女刺激床爽爽视频免费软件| 国模国模琳琳大尺私拍图片| 黄网在线免费| 美女鸡鸡软件| 退休的老王肉玲玲| 美女露大胸秘?洗澡跳舞| 波多野在线观看| 可以免费观看美女视频软件 | 放荡的寡妇a级美国大片| 军婚巨肉黄暴辣HH文| 国产熟妇AV一区21p| 天堂在线资源| 公妇乱婬视频在线播放| 高H肉边走边做哭abo| 亚洲**2018在线观看| 区产品乱码芒果精品p站| 撅着屁股挨操| 99在线精品国自产拍不卡五月色 | 熟女作女系列电影| 美国式禁忌8| 西欧free性video巴西| 波多野结衣被隔壁邻居 | 国产午夜一级特黄A片大红米店| 91在线免费观看网站| 成人免费高清完整版在线观看| 国产曰的好深好爽免费视频| 国产一二三精品无码不卡| 淫男乱女小说阅读| 俄罗斯一级大片| 欧美在线免费播放| 男女XXOO动态图无遮挡gif| 古代美女春交性| 午夜精品一区二区三区,|