欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

內置append()函數(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
}

運行結果:

這里寫圖片描述

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

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

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

1. 通過鏈式append 實現(xiàn)

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

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調用都會創(chuàng)建一個臨時切片,并將a[i:]的內容復制到新創(chuàng)建的切片中,然后將臨時創(chuàng)建的切片再追加到a[:i]。

2. 通過copy + append 實現(xiàn)

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

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語言中切片作為函數(shù)參數(shù),函數(shù)中使用append添加元素

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

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

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

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添加數(shù)據(jù)之后的地址:%p", s)
 /*
 append添加元素,容量足夠,則在原基礎之上添加數(shù)據(jù),地址不會發(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ù),容量不夠,則另行開辟空間,切片地址發(fā)生變化
 輸出:
 append添加數(shù)據(jù)之前的地址:0xc04200e2c0
 append添加數(shù)據(jù)之后的地址:0xc04200a2d0
 */
}
func main() {
 /*
 copy(目的切片,原切片):切片拷貝
 注意事項:目的切片要有足夠的空間,如果沒有空間(切片為空或者指向0x0),不能進行拷貝
           若目的切片容量不足,只拷貝部分(目的切片長度的部分)
 返回值為拷貝成功的切片數(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)
}

補充說明:

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

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

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

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

相關文章

  • go連接kafka的實現(xiàn)示例

    go連接kafka的實現(xiàn)示例

    本文主要介紹了go連接kafka的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • GoLand利用plantuml生成UML類圖

    GoLand利用plantuml生成UML類圖

    本文主要介紹了GoLand利用plantuml生成UML類圖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • Go定時器cron的使用詳解

    Go定時器cron的使用詳解

    本篇文章主要介紹了Go定時器cron的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 使用Go HTTP客戶端打造高性能服務

    使用Go HTTP客戶端打造高性能服務

    大多數(shù)語言都有提供各自的 HTTP 客戶端,本文將動手實踐如何使用Go語言發(fā)起HTTP請求,并討論其中有可能遇到的問題。具有一定的參考價值,感興趣的可以了解一下
    2021-12-12
  • 十個示例帶你深入了解Go語言中的接口

    十個示例帶你深入了解Go語言中的接口

    這篇文章主要是通過十個簡單的示例帶大家深入了解一下Go語言中接口的使用,文中的示例代碼簡潔易懂,具有一定的學習價值,需要的可以了解一下
    2023-02-02
  • golang調用c實現(xiàn)的dll接口細節(jié)分享

    golang調用c實現(xiàn)的dll接口細節(jié)分享

    這篇文章主要介紹了golang調用c實現(xiàn)的dll接口細節(jié)分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go用兩個協(xié)程交替打印100以內的奇偶數(shù)的方法詳解

    Go用兩個協(xié)程交替打印100以內的奇偶數(shù)的方法詳解

    這篇文章主要給大家詳細介紹了Go用兩個協(xié)程交替打印100以內的奇偶數(shù)的示例代碼,文中給大家介紹了兩個實現(xiàn)方法,使用無緩沖的channel和設置GOMAXPROCS=1,介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • Golang map實現(xiàn)原理淺析

    Golang map實現(xiàn)原理淺析

    Go中Map是一個KV對集合,下面這篇文章主要給大家介紹了關于Golang中map探究的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-12-12
  • go語言方法集為類型添加方法示例解析

    go語言方法集為類型添加方法示例解析

    這篇文章主要為大家介紹了go語言方法集以及為類型添加方法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • go語言基礎語法示例

    go語言基礎語法示例

    這篇文章主要介紹了go語言基礎語法示例,介紹了go語言較為全面的基礎知識,具有一定參考價值,需要的可以了解下。
    2017-11-11

最新評論