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

Go?slice切片make生成append追加copy復(fù)制示例

 更新時(shí)間:2022年06月13日 10:59:56   作者:王中陽(yáng)Go  
這篇文章主要為大家介紹了Go使用make生成切片、使用append追加切片元素、使用copy復(fù)制切片使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

回顧

上一篇文章我們介紹了切片slice的定義初始化、引用類型特征、如何使用數(shù)組切割成切片。

這篇文章介紹切片的生成make()、切片的追加append()、切片的復(fù)制copy()。對(duì)知識(shí)點(diǎn)進(jìn)行詳細(xì)介紹和應(yīng)用實(shí)戰(zhàn)。

加深理解

  • 切片的本質(zhì):切片的本質(zhì)是一個(gè)框,框住了一塊連續(xù)的內(nèi)存
  • 切片屬于引用類型,真正的數(shù)據(jù)都是保存在底層數(shù)組里的
  • 切片可以簡(jiǎn)單理解為是快捷方式,修改會(huì)互相影響
  • 判斷一個(gè)切片是否為空,使用len(s) == 0 判斷,不能使用 s==nil 判斷

生成切片 make

上需求:請(qǐng)定義一個(gè)長(zhǎng)度為5,容量為10的整型切片。

上代碼:

s1 := make([]int,5,10)
fmt.Printf("s1:%v len(s1):%d cap(s1):%d\n", s1, len(s1), cap(s1))

打印結(jié)果:

分析:make()函數(shù)的第一個(gè)參數(shù)指定切片的數(shù)組類型,第二個(gè)參數(shù)指定切片的長(zhǎng)度,第三個(gè)參數(shù)指定切片的容量。

更好的理解長(zhǎng)度和容量

s1 := make([]int,5,10)
fmt.Printf("s1:%v len(s1):%d cap(s1):%d\n", s1, len(s1), cap(s1))
s2 := make([]int, 0, 10)
fmt.Printf("s2=%v len(s2)=%d cap(s2)=%d\n", s2, len(s2), cap(s2))

打印結(jié)果:

分析: 我們可以發(fā)現(xiàn)定義切片時(shí)元素的個(gè)數(shù)和長(zhǎng)度相關(guān),因?yàn)殚L(zhǎng)度就是元素的個(gè)數(shù)。

容量我們?cè)谙旅娼榻Bappend()時(shí),重點(diǎn)介紹一下。

切片引用類型實(shí)戰(zhàn)

上代碼

//切片
s3 := make([]int, 3, 3)
s3 = []int{1, 2, 3}
s4 := s3            //s3 s4都指向同一個(gè)底層數(shù)組
fmt.Println(s3, s4) //[1 2 3]  [1 2 3]
s3[0] = 1000
fmt.Println(s3, s4) //[1000 2 3] [1 2 3]
fmt.Println("-----")
//數(shù)組
a3 := [3]int{1, 2, 4}
a4 := a3
fmt.Println(a3, a4)
a3[0] = 1000
fmt.Println(a3, a4)

打印結(jié)果:

分析:通過(guò)上面的打印結(jié)果我們可以很直觀的看出來(lái),切片引用類型的本質(zhì),當(dāng)切片修改時(shí)會(huì)互相影響;而數(shù)組作為值類型,不會(huì)互相影響。

切片的遍歷

和數(shù)組一樣,用fori或者for range進(jìn)行遍歷即可。

s3 := make([]int, 3, 3)
s3 = []int{1, 2, 3}
for i := 0; i < len(s3); i++ {
   fmt.Println(s3[i])
}
for i, v := range s3 {
   fmt.Println(i, v)
}

append

首先,我們定義一個(gè)切片

s1 := []string{"北京", "上海", "大連", "佛山"}
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))

打印結(jié)果:

分析:我們發(fā)現(xiàn)切片的長(zhǎng)度和容量都是4

然后,我們使用append()函數(shù)追加一個(gè)元素

s1 := []string{"北京", "上海", "大連", "佛山"}
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
s1 = append(s1, "唐山") //切片append()追加之后,
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))

打印結(jié)果:

分析:長(zhǎng)度由4變成5,我們很好理解;容量為什么會(huì)從4變成8呢?

這是Go語(yǔ)言對(duì)切片的自動(dòng)擴(kuò)容機(jī)制。append()追加元素,原來(lái)的底層數(shù)據(jù)容量不夠時(shí),go底層會(huì)把底層數(shù)組替換,是go語(yǔ)言的一套擴(kuò)容策略

我后面會(huì)單獨(dú)寫一篇來(lái)講自動(dòng)擴(kuò)容策略是如何實(shí)現(xiàn)的。歡迎大家持續(xù)關(guān)注我的專欄Go語(yǔ)言學(xué)習(xí)專欄

多次追加

多次追加的概念很好理解,就是多次調(diào)用append()

舉個(gè)栗子:

s1 := []string{"北京", "上海", "大連", "佛山"}
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
s1 = append(s1, "唐山") //切片append()追加之后,
fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1))
var s2 []string
s2 = append(s1, "雄安")
fmt.Printf("s2=%v len(s2)=%d cap(s2)=%d\n", s2, len(s2), cap(s2))

打印結(jié)果:

分析: s1經(jīng)過(guò)兩次append追加元素,賦值給了s2

追加多個(gè)元素

當(dāng)我們需要追加多個(gè)元素時(shí),難道只能像上面這樣多次調(diào)用append嗎?

當(dāng)然不是的。

舉個(gè)栗子:

s1 := []string{"北京", "上海", "大連", "佛山"}
s3 := []string{"太原","石家莊"}
var s4 []string
s4 = append(s1,s3...) // ...表示拆開,將切片的值作為追加的元素
fmt.Printf("s4的值:%v",s4)

打印結(jié)果:

注意:append的第二個(gè)參數(shù),我們傳入了一個(gè)切片,需要在切片后寫死...,表示將切片切割,將切片的值作為追加到第一個(gè)參數(shù)中的元素。

復(fù)制切片

下面演示兩種方式:

//定義切片s1
s1 := []int{1, 2, 3}
//第一種方式:直接聲明變量 用=賦值
//s2切片和s1引用同一個(gè)內(nèi)存地址
var s2 = s1
//第二種方式:copy
var s3 = make([]int, 3)
copy(s3, s1)            //使用copy函數(shù)將 參數(shù)2的元素復(fù)制到參數(shù)1
fmt.Println(s1, s2, s3) //都是[1 2 3]

打印結(jié)果:都返回[1 2 3]

注意:make和:=不能同時(shí)使用,這種是錯(cuò)誤的寫法 :s3 := make([]int, 5)

聰明的小伙伴們是不是提出疑問(wèn)了呢?

既然結(jié)果一樣,為什么要引出copy這個(gè)函數(shù)呢?

咱們接著往下看,就知道所以然了。

//定義切片s1
s1 := []int{1, 2, 3}
//第一種方式:直接聲明變量 用=賦值
//s2切片和s1引用同一個(gè)內(nèi)存地址
var s2 = s1
//第二種方式:copy
var s3 = make([]int, 3)
copy(s3, s1)            //使用copy函數(shù)將 參數(shù)2的元素復(fù)制到參數(shù)1
s1[0] = 11
fmt.Printf("s1:%v s2:%v s3:%v",s1, s2, s3) //s1和s2是[11 2 3] s3是[1 2 3]

打印結(jié)果:

分析: 我們發(fā)現(xiàn)s1和s2是[11 2 3] s3是[1 2 3],說(shuō)明copy方法是復(fù)制了一份,開辟了新的內(nèi)存空間,不再引用s1的內(nèi)存地址,這就是兩者的區(qū)別。

刪除元素

注意:刪除切片中的元素 不能直接刪除 可以組合使用分割+append的方式刪除切片中的元素

舉個(gè)栗子:比如切除s3中的元素2(下標(biāo)為1的元素)

s3 := []int{1, 2, 3}
s3 = append(s3[:1], s3[2:]...) //第一個(gè)不用拆開 原因是一個(gè)作為被接受的一方  是把后面的元素追加到第一個(gè)
fmt.Println(s3)                

打印結(jié)果:

注意:上面代碼段中有我添加的注釋:append()函數(shù)中第一個(gè)切片不用拆開,原因是一個(gè)作為被接受的一方,是把后面的元素追加到第一個(gè)切片中。

數(shù)組轉(zhuǎn)切片

a1 := [...]int{1,2,3}
s1 := a1[:]
fmt.Printf("a1類型:%T\ns1類型:%T",a1,s1)

打印結(jié)果:

實(shí)戰(zhàn)演練

猜想一下下面程序的運(yùn)行結(jié)果:

s1 := make([]int, 5, 10)
for i := 0; i < 10; i++ {
   s1 = append(s1, i)
}
fmt.Println(s1)

.

.

.

打印結(jié)果:

分析: 我們靜下心來(lái)逐步推導(dǎo)就ok了:

  • s1 := make([]int, 5, 10) 生成的是切片: [0 0 0 0 0]
  • for循環(huán)中每次將自增的i值追加到上面的切片中
  • 所以最終打印的結(jié)果是:[0 0 0 0 0 0 1 2 3 4 5 6 7 8 9]

總結(jié)

這篇文章匯總了使用make生成切片、使用append追加切片元素、使用copy復(fù)制切片,開辟新的內(nèi)存空間、使用切片分割和append來(lái)刪除切片,更多關(guān)于Go make生成slice切片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入理解Go高級(jí)并發(fā)模式編寫更高效可擴(kuò)展的應(yīng)用程序

    深入理解Go高級(jí)并發(fā)模式編寫更高效可擴(kuò)展的應(yīng)用程序

    Go對(duì)并發(fā)提供了強(qiáng)大的原生支持,本文討論Go的高級(jí)并發(fā)模式,理解這些并發(fā)模式,可以幫助我們編寫高效的Go應(yīng)用程序,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • 使用go語(yǔ)言實(shí)現(xiàn)Redis持久化的示例代碼

    使用go語(yǔ)言實(shí)現(xiàn)Redis持久化的示例代碼

    redis 是一個(gè)內(nèi)存數(shù)據(jù)庫(kù),如果你把進(jìn)程殺掉,那么里面存儲(chǔ)的數(shù)據(jù)都會(huì)消失,那么這篇文章就是來(lái)解決 redis 持久化的問(wèn)題,本文給大家介紹了使用go語(yǔ)言實(shí)現(xiàn)Redis持久化,需要的朋友可以參考下
    2024-07-07
  • Go 自定義package包設(shè)置與導(dǎo)入操作

    Go 自定義package包設(shè)置與導(dǎo)入操作

    這篇文章主要介紹了Go 自定義package包設(shè)置與導(dǎo)入操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • go語(yǔ)言中函數(shù)的用法示例詳解

    go語(yǔ)言中函數(shù)的用法示例詳解

    Go語(yǔ)言中函數(shù)是基本的代碼組織單元,用于封裝一段代碼,使代碼結(jié)構(gòu)更清晰、可復(fù)用,本文詳細(xì)講解了基本函數(shù)定義、參數(shù)傳遞、返回值、多返回值、匿名函數(shù)、遞歸和defer語(yǔ)句的使用,感興趣的朋友一起看看吧
    2024-10-10
  • Go語(yǔ)言使用sort包對(duì)任意類型元素的集合進(jìn)行排序的方法

    Go語(yǔ)言使用sort包對(duì)任意類型元素的集合進(jìn)行排序的方法

    這篇文章主要介紹了Go語(yǔ)言使用sort包對(duì)任意類型元素的集合進(jìn)行排序的方法,實(shí)例分析了sort排序所涉及的方法與相關(guān)的使用技巧,需要的朋友可以參考下
    2015-02-02
  • golang atomic原子操作示例詳解

    golang atomic原子操作示例詳解

    這篇文章主要為大家介紹了golang atomic原子操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Go語(yǔ)言中使用flag包對(duì)命令行進(jìn)行參數(shù)解析的方法

    Go語(yǔ)言中使用flag包對(duì)命令行進(jìn)行參數(shù)解析的方法

    這篇文章主要介紹了Go語(yǔ)言中使用flag包對(duì)命令行進(jìn)行參數(shù)解析的方法,文中舉了一個(gè)實(shí)現(xiàn)flag.Value接口來(lái)自定義flag的例子,需要的朋友可以參考下
    2016-04-04
  • 解決Golang map range遍歷結(jié)果不穩(wěn)定問(wèn)題

    解決Golang map range遍歷結(jié)果不穩(wěn)定問(wèn)題

    這篇文章主要介紹了解決Golang map range遍歷結(jié)果不穩(wěn)定問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 一起來(lái)用GoLand開發(fā)第一個(gè)Go程序

    一起來(lái)用GoLand開發(fā)第一個(gè)Go程序

    當(dāng)您在編輯器中工作時(shí)GoLand 會(huì)分析您的代碼,尋找優(yōu)化方法,并檢測(cè)潛在和實(shí)際問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于用GoLand開發(fā)第一個(gè)Go程序的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Go語(yǔ)言中常量定義方法實(shí)例分析

    Go語(yǔ)言中常量定義方法實(shí)例分析

    這篇文章主要介紹了Go語(yǔ)言中常量定義方法,以實(shí)例形式分析了Go語(yǔ)言中常量的定義及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02

最新評(píng)論

屯门区| 磴口县| 高青县| 灵石县| 湖口县| 泸州市| 武胜县| 湛江市| 兴海县| 获嘉县| 浮山县| 昭苏县| 南投市| 彩票| 岳普湖县| 瓦房店市| 前郭尔| 兴城市| 正安县| 泰州市| 景泰县| 聂荣县| 平顶山市| 北京市| 茶陵县| 诏安县| 柞水县| 西峡县| 准格尔旗| 汨罗市| 屯门区| 安溪县| 衡东县| 金堂县| 马关县| 辛集市| 青田县| 莱州市| 大英县| 晋宁县| 泰州市|