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

一篇文章帶你了解Go語言基礎(chǔ)之切片補充

開發(fā) 前端
其實切片的本質(zhì),還是數(shù)組,只不過是Go幫助我們做了一些封裝,可以方便的對切片里面的數(shù)據(jù)增刪改查。

前言

Hey,大家好呀,我是星期八,這次咱們繼續(xù)學(xué)習(xí)Go基礎(chǔ)之切片補充扒。

make疑云

我們知道,可以通過make創(chuàng)建切片。

var names = make([]string,10,10)

這句話表示動態(tài)創(chuàng)建了一個切片,切片中的元素數(shù)量為10個,切片的容量也為10個。

你有疑惑嗎???

切片的數(shù)量和容量是什么???

他倆什么關(guān)系???

切片本質(zhì)

其實切片,終究是一個存儲數(shù)據(jù)的一個東西,目前知道數(shù)組是可以存儲東西的。

其實切片的本質(zhì),還是數(shù)組,只不過是Go幫助我們做了一些封裝,可以方便的對切片里面的數(shù)據(jù)增刪改查。

例如:

package main

import "fmt"

func main() {
var names = make([]int4, 10)
//int類型默認(rèn)值是0
fmt.Println(names, len(names), cap(names)) //結(jié)果:[0 0 0 0] 4 10
}

理解圖。

沒錯,本質(zhì)就是指向了一個長一點的數(shù)組。

但是這個數(shù)組是會自動擴容的,當(dāng)容量(cap)append滿了之后,會自動擴容。

現(xiàn)在,我們就知道m(xù)ake里面參數(shù)的意義了。

注意:在Go中,推薦使用make創(chuàng)建切片,并且在創(chuàng)建時,需要考慮容量,盡可能不觸發(fā)容量自動擴容機制,提高性能。

為什么切片append之后,前面會有空格

在上一章中,大概有這樣一段代碼。


package main

import "fmt"

func main() {
var names = make([]int,5,10)
names = append(names,11,23,231)
fmt.Println(names)//[0 0 0 0 0 11 23 231]
}

append之后,前面會有很多0,這是怎么回事。

解釋:

在通過make創(chuàng)建切片時,第二個參數(shù)是切片元素的數(shù)量。

上述代碼切片第二個參數(shù)是5,表示在創(chuàng)建切片時,前5個就已經(jīng)有值了,只不過是int默認(rèn)值0。

所以再append時,是再原有的基礎(chǔ)上,添加值的,直到cap滿了之后,觸發(fā)擴容機制。

如圖所示。

現(xiàn)在,清晰了吧?

那怎么append時,從0開始呢???

這不是很簡單,直接讓第二個參數(shù)為0。

var names = make([]int,0,10)
//結(jié)果:[11 23 231]

如圖所示。

好了,這個,懂了吧,怎么繼續(xù)哈。

為什么不推薦使用var []類型方式創(chuàng)建切片

我們上述一直在提一個詞,自動擴容。

我們來看這樣一段普通的代碼。

package main

import "fmt"

func main() {
var names []int
//地址:0x0,長度(len):0,容量(cap):0
fmt.Printf("地址:%p,長度(len):%d,容量(cap):%d\n", names, len(names), cap(names))
names = append(names, 12, 3)

//地址:0xc000010380,長度(len):3,容量(cap):4
fmt.Printf("地址:%p,長度(len):%d,容量(cap):%d\n", names, len(names), cap(names))
}

雖然按照這種方法,使用append動態(tài)添加是沒問題的。

在不使用make聲明數(shù)組時,len和cap都是0,并且地址也是一個值。

通過append之后,可以明顯看到,地址發(fā)生了改變,因為又重新申請了數(shù)組,切片重新指向新的數(shù)組。

len和cap也發(fā)生了變化。

copy復(fù)制切片

package main

import "fmt"

func main() {
var names1 = make([]string, 0, 10)
names1 = append(names1, "張三")
names1 = append(names1, "李四")
var names2 = names1 //將names1賦值到names2
fmt.Println(names1, names2) //[張三 李四] [張三 李四]
names1[0] = "張三666"//修改names下標(biāo)為0的值為 張三666
fmt.Println(names1, names2) //[張三666 李四] [張三666 李四]
//為什么修改names1的值,會影響names2的值????
}

為什么修改names1的值,會影響names2的值???

這個,就又要回到內(nèi)存分布圖了,如圖所示。

我們說過很多次,不管是打印,還是賦值等操作,只會操作棧上面存儲的值。

當(dāng)names2=names1時,只會把names1棧上面的地址,給names2。

但是存的時堆上面的地址,終究還是指向了同一個堆。

所以修改names1時,names2也修改了。

那如果不想出現(xiàn)上述問題怎么辦???

解決辦法:使用copy

package main

import "fmt"

func main() {
var names1 = make([]string, 0, 10)
names1 = append(names1, "張三")
names1 = append(names1, "李四")
//定義一個names2切片用于接收,第二個參數(shù)要留空間,names1里面又幾個元素,names2第二個參數(shù)也要是幾
var names2 = make([]string, 210)
copy(names2, names1)//將names1的值,賦值到names2
fmt.Println(names1, names2) //[張三 李四] [張三 李四]
names1[0] = "張三666"//修改names下標(biāo)為0的值為 張三666
fmt.Println(names1, names2) //[張三666 李四] [張三 李四]
fmt.Printf("names1地址:%p names2地址:%p\n",names1,names2)
//names1地址:0xc00009a0a0 names2地址:0xc00009a140
}

內(nèi)存圖:

自動擴容機制

非常抱歉,我不會 。。。

總結(jié)

上述我們學(xué)習(xí)了Go基礎(chǔ)之切片補充。如果在操作過程中有任務(wù)問題,記得在下面的討論區(qū)留言,我們看到會第一時間解決問題。

責(zé)任編輯:武曉燕 來源: Go語言進階學(xué)習(xí)
相關(guān)推薦

2020-11-05 09:58:16

Go語言Map

2022-02-16 10:03:06

對象接口代碼

2020-10-22 08:33:22

Go語言

2020-11-11 10:52:54

Go語言C語言

2021-10-09 07:10:31

Go語言基礎(chǔ)

2020-10-23 08:38:19

Go語言

2020-10-25 07:33:13

Go語言

2020-12-09 09:59:32

Go語言技術(shù)

2020-12-30 09:04:32

Go語言TCPUDP

2020-12-27 10:15:44

Go語言channel管道

2020-12-07 05:59:02

語言Go接口

2021-10-30 10:43:04

語言Go函數(shù)

2021-11-03 10:02:07

Go基礎(chǔ)函數(shù)

2021-09-29 10:00:07

Go語言基礎(chǔ)

2021-10-13 10:00:52

Go語言基礎(chǔ)

2020-10-22 11:15:47

Go語言變量

2021-10-16 10:17:51

Go語言數(shù)據(jù)類型

2020-12-23 08:39:11

Go語言基礎(chǔ)技術(shù)

2021-02-20 10:06:14

語言文件操作

2021-01-13 08:40:04

Go語言文件操作
點贊
收藏

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

主站蜘蛛池模板: 免费在线观看黄网站 | 成年视频在线观看福利资源 | 午夜在线精品偷拍 | 日韩欧美在线观看视频网站 | 国产精品自产av一区二区三区 | 色综合九九 | 国产欧美精品一区二区 | 国产女人与拘做视频免费 | 久久激情视频 | 天堂色区 | 亚洲精品一区在线观看 | 色就是色欧美 | 亚洲h视频 | 精品日韩在线 | 中文字幕日韩欧美 | 亚洲免费精品 | 亚洲欧美在线观看 | 精品1区2区 | 午夜三级视频 | 国产欧美一区二区三区久久手机版 | 亚洲视频在线一区 | 久久精品亚洲欧美日韩久久 | 一区二区高清在线观看 | 国产精品不卡一区 | 中文字幕亚洲精品 | 国产精品亚洲综合 | 亚洲毛片在线观看 | 密乳av| 精品国产一区二区三区在线观看 | 女人av| 国产精品日日摸夜夜添夜夜av | 91在线视频观看免费 | 国产精品123区 | 黄色毛片黄色毛片 | 在线观看av网站永久 | 亚洲福利视频网 | 国产精品久久久久久久7电影 | 日本久久久一区二区三区 | 免费三级黄| 一级黄色播放 | 国产一二三区电影 |