最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言切片前或中間插入項(xiàng)與內(nèi)置copy()函數(shù)詳解

 更新時(shí)間:2021年04月26日 14:39:56   作者:棄更內(nèi)容請(qǐng)謹(jǐn)慎查看  
這篇文章主要介紹了Go語(yǔ)言切片前或中間插入項(xiàng)與內(nèi)置copy()函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

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

看下代碼:

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
}

運(yùn)行結(jié)果:

這里寫(xiě)圖片描述

自定義的InsertStringSliceCopy()函數(shù)可以實(shí)現(xiàn)在切片相應(yīng)的位置插入項(xiàng)

此外InsertStringSliceCopy()函數(shù)中打印類(lèi)變量at的類(lèi)型,可知內(nèi)置函數(shù)copy()在實(shí)現(xiàn)復(fù)制功能的時(shí)候會(huì)有一個(gè)int的返回值

補(bǔ)充:go學(xué)習(xí)備忘錄 - 切片中間插入元素

1. 通過(guò)鏈?zhǔn)絘ppend 實(shí)現(xiàn)

將多個(gè)append操作組合起來(lái),實(shí)現(xiàn)在切片中間插入元素:

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

每個(gè)鏈?zhǔn)讲僮髦械牡诙€(gè)append調(diào)用都會(huì)創(chuàng)建一個(gè)臨時(shí)切片,并將a[i:]的內(nèi)容復(fù)制到新創(chuàng)建的切片中,然后將臨時(shí)創(chuàng)建的切片再追加到a[:i]。

2. 通過(guò)copy + append 實(shí)現(xiàn)

通過(guò) copy和append組合 可以避免創(chuàng)建中間的臨時(shí)切片

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

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

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

注:append本質(zhì)是用于追加元素而不是擴(kuò)展容量,擴(kuò)展切片容量只是append的一個(gè)副作用。

補(bǔ)充:Go語(yǔ)言中切片作為函數(shù)參數(shù),函數(shù)中使用append添加元素

切片作為函數(shù),通過(guò)append添加元素,有可能會(huì)更改地址:

1)添加的數(shù)據(jù)元素長(zhǎng)度超過(guò)切片參數(shù)的容量,則會(huì)另開(kāi)辟空間,重新分配底層數(shù)組,并復(fù)制數(shù)據(jù)。函數(shù)中的此切片與原切片地址不同; 此切片指向新開(kāi)辟的內(nèi)存。函數(shù)運(yùn)行結(jié)束,內(nèi)存釋放,不會(huì)影響元切片的內(nèi)容。

2)否則原切片與函數(shù)中的切片指向同一地址。會(huì)影響切片的內(nèi)容。

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

代碼測(cè)試:

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添加數(shù)據(jù)之后的地址:%p", s)
 /*
 append添加元素,容量足夠,則在原基礎(chǔ)之上添加數(shù)據(jù),地址不會(huì)發(fā)生改變
 輸出:
 原地址:0xc04207e030
 添加數(shù)據(jù)之后的地址:0xc04207e030
 */
}
func main02() {
 s := make([]int, 3)
 s[2] = 666
 fmt.Printf("append添加數(shù)據(jù)之前的地址:%p", s)
 s = append(s, 888)
 fmt.Printf("\nappend添加數(shù)據(jù)之后的地址:%p", s)
 
 /*
 append添加數(shù)據(jù),容量不夠,則另行開(kāi)辟空間,切片地址發(fā)生變化
 輸出:
 append添加數(shù)據(jù)之前的地址:0xc04200e2c0
 append添加數(shù)據(jù)之后的地址:0xc04200a2d0
 */
}
func main() {
 /*
 copy(目的切片,原切片):切片拷貝
 注意事項(xiàng):目的切片要有足夠的空間,如果沒(méi)有空間(切片為空或者指向0x0),不能進(jìn)行拷貝
           若目的切片容量不足,只拷貝部分(目的切片長(zhǎng)度的部分)
 返回值為拷貝成功的切片數(shù)量
 */
 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,數(shù)量:%d", s1, n)
 fmt.Println(s1)
}

補(bǔ)充說(shuō)明:

數(shù)組和slice之間有著緊密的聯(lián)系。一個(gè)slice是一個(gè)輕量級(jí)的數(shù)據(jù)結(jié)構(gòu),提供了訪(fǎng)問(wèn)數(shù)組子序列(或者全部)元素的功能,而且slice的底層確實(shí)引用一個(gè)數(shù)組對(duì)象。一個(gè)slice由三個(gè)部分構(gòu)成:指針、長(zhǎng)度和容量。指針指向第一個(gè)slice元素對(duì)應(yīng)的底層數(shù)組元素的地址,要注意的是slice的第一個(gè)元素并不一定就是數(shù)組的第一個(gè)元素。

切片并不是數(shù)組或數(shù)組指針,它通過(guò)內(nèi)部指針和相關(guān)屬性引⽤數(shù)組⽚段,以實(shí)現(xiàn)變⻓⽅案。

slice并不是真正意義上的動(dòng)態(tài)數(shù)組,而是一個(gè)引用類(lèi)型。slice總是指向一個(gè)底層array,slice的聲明也可以像array一樣,只是不需要長(zhǎng)度。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • 詳解Golang中哪些類(lèi)型可以作為map的key

    詳解Golang中哪些類(lèi)型可以作為map的key

    在 Go 語(yǔ)言中,map 是一種內(nèi)置的關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)類(lèi)型,由一組無(wú)序的鍵值對(duì)組成,每個(gè)鍵都是唯一的,并與一個(gè)對(duì)應(yīng)的值相關(guān)聯(lián),本文將詳細(xì)介紹哪些類(lèi)型的變量可以作為 map 的鍵,并通過(guò)實(shí)例進(jìn)行說(shuō)明,感興趣的朋友可以參考下
    2024-01-01
  • Golang小數(shù)操作指南之判斷小數(shù)點(diǎn)位數(shù)與四舍五入

    Golang小數(shù)操作指南之判斷小數(shù)點(diǎn)位數(shù)與四舍五入

    這篇文章主要給大家介紹了關(guān)于Golang小數(shù)操作指南之判斷小數(shù)點(diǎn)位數(shù)與四舍五入的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Go設(shè)計(jì)模式之模板方法模式講解和代碼示例

    Go設(shè)計(jì)模式之模板方法模式講解和代碼示例

    模版方法是一種行為設(shè)計(jì)模式, 它在基類(lèi)中定義了一個(gè)算法的框架, 允許子類(lèi)在不修改結(jié)構(gòu)的情況下重寫(xiě)算法的特定步驟,本文將通過(guò)代碼示例給大家詳細(xì)的介紹一下Go模板方法模式,需要的朋友可以參考下
    2023-08-08
  • go責(zé)任鏈行為型設(shè)計(jì)模式Chain?Of?Responsibility

    go責(zé)任鏈行為型設(shè)計(jì)模式Chain?Of?Responsibility

    這篇文章主要為大家介紹了go行為型設(shè)計(jì)模式之責(zé)任鏈Chain?Of?Responsibility使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 基于go+vue實(shí)現(xiàn)的golang每日新聞數(shù)據(jù)瀏覽與檢索平臺(tái)(推薦)

    基于go+vue實(shí)現(xiàn)的golang每日新聞數(shù)據(jù)瀏覽與檢索平臺(tái)(推薦)

    gonews是基于 go+vue 實(shí)現(xiàn)的golang每日新聞瀏覽與檢索平臺(tái),本文通過(guò)實(shí)例代碼給大家講解,介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-01-01
  • Go?gRPC服務(wù)客戶(hù)端流式RPC教程

    Go?gRPC服務(wù)客戶(hù)端流式RPC教程

    這篇文章主要為大家介紹了Go?gRPC服務(wù)客戶(hù)端流式RPC教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • GO語(yǔ)言協(xié)程互斥鎖Mutex和讀寫(xiě)鎖RWMutex用法實(shí)例詳解

    GO語(yǔ)言協(xié)程互斥鎖Mutex和讀寫(xiě)鎖RWMutex用法實(shí)例詳解

    這篇文章主要介紹了GO語(yǔ)言協(xié)程互斥鎖Mutex和讀寫(xiě)鎖RWMutex用法詳解,需要的朋友可以參考下
    2022-04-04
  • 最新評(píng)論

    卢龙县| 常宁市| 龙南县| 自贡市| 临猗县| 沁水县| 调兵山市| 尼玛县| 泰州市| 锡林郭勒盟| 嘉峪关市| 贵溪市| 江源县| 通榆县| 寿阳县| 益阳市| 郧西县| 利川市| 河北省| 陵水| 遵义县| 玉门市| 开封市| 开化县| 荃湾区| 牟定县| 隆安县| 萝北县| 泽州县| 邵东县| 任丘市| 皮山县| 新田县| 台湾省| 黄浦区| 观塘区| 仪征市| 天峻县| 涟水县| 怀安县| 台湾省|