成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【Go Slice詳解】讀者紛紛表示終于理解了Cap

開(kāi)發(fā) 后端
切片是引用類(lèi)型,可以理解為引用數(shù)組的一個(gè)片段;而數(shù)組是值類(lèi)型,把數(shù)組A賦值給數(shù)組B,會(huì)為數(shù)組B開(kāi)辟新的內(nèi)存空間,修改數(shù)組B的值并不會(huì)影響數(shù)組A。

定義

var s1 []int    //定義一個(gè)存放int類(lèi)型元素的切片
var s2 []string //定義一個(gè)存放string類(lèi)型元素的切片
fmt.Println(s1, s2)
fmt.Println(s1 == nil) //true 為空 沒(méi)有開(kāi)辟內(nèi)存空間
fmt.Println(s2 == nil) //true

打印結(jié)果:

圖片

解析: 說(shuō)明我們已經(jīng)聲明成功了,但是并沒(méi)有開(kāi)辟內(nèi)存空間,因?yàn)閟1、s2的值為nil

聲明并初始化

我們可以在聲明的同時(shí)初始化

var s1 = []int{1, 2, 3}
var s2 = []string{"北苑", "長(zhǎng)陽(yáng)", "望京"}
fmt.Println(s1, s2)
fmt.Println(s1 == nil) //false
fmt.Println(s2 == nil) //false

打印結(jié)果:

圖片

解析:初始化成功,s1 s2的值都不等于nil

長(zhǎng)度和容量

分別使用len()、cap()獲得切片的長(zhǎng)度和容量

fmt.Printf("len(s1):%d cap(s1):%d\n", len(s1), cap(s1))
fmt.Printf("len(s2):%d cap(s2):%d\n", len(s2), cap(s2))

打印結(jié)果:

圖片

解析:和我們預(yù)期的一致,長(zhǎng)度和容量都為3

由數(shù)組得到切片

開(kāi)篇我已經(jīng)提到數(shù)組和切片的關(guān)系,這里再進(jìn)一步講一下:

  • 切片的本質(zhì)是操作數(shù)組,只是數(shù)組是固定長(zhǎng)度的,而切片的長(zhǎng)度可變的
  • 切片是引用類(lèi)型,可以理解為引用數(shù)組的一個(gè)片段;而數(shù)組是值類(lèi)型,把數(shù)組A賦值給數(shù)組B,會(huì)為數(shù)組B開(kāi)辟新的內(nèi)存空間,修改數(shù)組B的值并不會(huì)影響數(shù)組A。
  • 而切片作為引用類(lèi)型,指向同一個(gè)內(nèi)存地址,是會(huì)互相影響的。
//定義一個(gè)數(shù)組
a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s3 := a1[0:4] //基于一個(gè)數(shù)組切割 [0:4]左包含 右不包含 即為[1,2,3,4]
fmt.Println(s3)

打印結(jié)果:

圖片

注意:a1[0:4] 基于一個(gè)數(shù)組切割  [0:4]左包含 右不包含  即為[1,2,3,4]

更多切割方式舉例

a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s4 := a1[2:4] //[3 4]
s5 := a1[:4] //[1 2 3 4]
s6 := a1[2:] //[3 4 5 6 7 8 9]
s7 := a1[:] //[1 2 3 4 5 6 7 8 9]
fmt.Println(s4)
fmt.Println(s5)
fmt.Println(s6)
fmt.Println(s7)

打印結(jié)果:

圖片

解析:都符合上面提到的??左包含,右不包含??原則 s4從下標(biāo)2開(kāi)始截取,截取到下標(biāo)4 s5省略了第一個(gè)參數(shù),表示從下標(biāo)0開(kāi)始截取 s6省略了第二個(gè)參數(shù),表示截取到最后一個(gè)元素 s7省略了兩個(gè)參數(shù),只填寫(xiě)了中間的冒號(hào):,表示取全部元素

切片的長(zhǎng)度和容量

切片的長(zhǎng)度很好理解,就是元素的個(gè)數(shù)。

切片的容量我們重點(diǎn)理解一下:在切片引用的底層數(shù)組中從切片的第一個(gè)元素到數(shù)組最后一個(gè)元素的長(zhǎng)度就是切片的容量

我來(lái)畫(huà)個(gè)圖:

圖片

再舉個(gè)栗子

我們看下面這個(gè)栗子就很好理解啦:

a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}

s5 := a1[:4] //[1 2 3 4]
s6 := a1[2:] //[3 4 5 6 7 8 9]
s7 := a1[:] //[1 2 3 4 5 6 7 8 9]

fmt.Printf("len(s5):%d cap(s5):%d\n", len(s5), cap(s5)) //4 9
fmt.Printf("len(s6):%d cap(s6):%d\n", len(s6), cap(s6)) //7 7
fmt.Printf("len(s7):%d cap(s7):%d\n", len(s7), cap(s7)) //9 9

打印結(jié)果:

圖片

解析:a1是數(shù)組長(zhǎng)度為9,容量也為9,值是從1~9

s5/s6/s7都是切割數(shù)組a1得到的切片。

s5的長(zhǎng)度為4,因?yàn)橹挥? 2 3 4這4個(gè)元素,容量為9,因?yàn)閟5切片是從數(shù)組起始位置開(kāi)始切割的:第一個(gè)元素是1,而s5底層數(shù)組a1最后一個(gè)元素是9,1~9共9個(gè)元素,所以s5的容量為9。

s6的長(zhǎng)度為7,因?yàn)閟6的元素是3-9這7個(gè)元素;容量也為7,因?yàn)閟5的底層數(shù)組最后一個(gè)元素是9,3-9共7個(gè)元素,所以s6的容量為7。

S7更好理解了,長(zhǎng)度和容量都是9,小伙伴們自己理解一下。

切片再切片

我們可以對(duì)切片進(jìn)行再切片操作

比如,我們針對(duì)上面的數(shù)據(jù)再次切片進(jìn)行測(cè)試

s8 :=s6[3:]
//s8的值為:6 7 8 9
fmt.Printf("len(s8):%d cap(s8):%d\n", len(s8), cap(s8)) //4 4

打印結(jié)果:

圖片

解析:我們知道可以對(duì)切片進(jìn)行再次切片就可以,至于長(zhǎng)度和容器大家搞明白上面的栗子,這個(gè)輸出結(jié)果就是意料之中的了。

slice是引用類(lèi)型

我們舉個(gè)栗子來(lái)證明切片是引用類(lèi)型

//定義數(shù)組
a1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
//由數(shù)組切割成切片s6
s6 := a1[2:] //[3 4 5 6 7 8 9]
//切片再次切片,賦值給s8
s8 :=s6[3:] //[6 7 8 9]
//修改原始數(shù)組,把下標(biāo)為2的值由3改為333
a1[2] = 333
//打印s6,發(fā)現(xiàn)s6中的3也變成了333
fmt.Println("s6:", s6) //[333 4 5 6 7 8 9]
//因?yàn)閟8基于s6切片而成,我們測(cè)試一下切片再切片的引用傳的
fmt.Println("s8:", s8) //[6 7 8 9]
//我們把原始數(shù)組下標(biāo)為5的值由6改為666
a1[5] = 666
//打印s8切片,得到結(jié)果6也變成了666
fmt.Println("s8:", s8) //[666 7 8 9]

打印結(jié)果:

圖片

解析:由此我們可以明確的知道切片是引用類(lèi)型,當(dāng)?shù)讓訑?shù)組改變時(shí),不管是切片,還是切片再切片,值都會(huì)改變。因?yàn)樗麄兪褂玫氖且粋€(gè)內(nèi)存塊,引用的一個(gè)內(nèi)存地址。

總結(jié)

這篇文章介紹了切片的特點(diǎn),如何定義切片,如果由數(shù)組切割切片,切片的引用類(lèi)型特征。

本文轉(zhuǎn)載自微信公眾號(hào)「 程序員升級(jí)打怪之旅」,作者「王中陽(yáng)Go」,可以通過(guò)以下二維碼關(guān)注。

轉(zhuǎn)載本文請(qǐng)聯(lián)系「 程序員升級(jí)打怪之旅」公眾號(hào)。

責(zé)任編輯:武曉燕 來(lái)源: 程序員升級(jí)打怪之旅
相關(guān)推薦

2013-01-07 13:23:36

智能手機(jī)5寸超大屏手機(jī)

2024-11-25 07:39:48

2022-05-03 00:03:11

狀態(tài)管理前端開(kāi)發(fā)

2023-08-03 07:49:39

N1節(jié)點(diǎn)網(wǎng)絡(luò)

2017-04-21 13:50:01

2020-04-16 10:55:03

Java虛擬機(jī)字節(jié)碼

2024-03-15 08:23:26

異步編程函數(shù)

2022-02-09 16:02:26

Go 語(yǔ)言ArraySlice

2019-12-26 09:15:44

網(wǎng)絡(luò)IOLinux

2017-08-31 11:28:47

Slice底層實(shí)現(xiàn)

2012-11-30 11:19:02

JavaScript

2018-03-21 16:19:40

MVCMVPMVVM

2012-06-15 09:56:40

2023-11-28 11:44:54

Go切片

2021-07-08 23:53:44

Go語(yǔ)言拷貝

2022-03-27 09:06:25

vuexActionsMutations

2019-09-16 08:32:59

遞歸算法編程

2022-10-20 18:43:32

C語(yǔ)言golang安全

2023-09-04 13:18:00

訓(xùn)練模型

2025-06-26 08:53:03

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一区二区三区影院 | 精久久久| 久久久国产一区二区三区 | 日韩在线 | 国产日韩欧美一区二区 | 国产精品免费一区二区三区 | 看片wwwwwwwwwww| 日韩av成人| h在线观看| 夜夜夜操 | 国产成人99久久亚洲综合精品 | 久久久精彩视频 | 欧美日韩电影一区二区 | 在线观看成人小视频 | 秋霞电影院午夜伦 | 久久这里只有 | 成人国产精品久久 | 日日干日日 | 亚洲一区二区久久 | 国产原创在线观看 | 免费看片国产 | 日本中文字幕一区 | 国产亚洲精品久久久久动 | 日本福利视频 | 欧美日韩久 | 欧美性受xxx | 国产精品视频网站 | 欧美日韩网站 | 亚洲国产日韩欧美 | 亚洲不卡视频 | 狠狠躁夜夜躁人人爽天天高潮 | 日本高清视频在线播放 | 国产玖玖| 成av在线 | 日韩美女在线看免费观看 | 国产二区视频 | 欧美精品一区二区三区在线播放 | 亚洲成人三级 | 国产午夜精品视频 | 99久久久久 | 精品一区二区三区四区 |