新聞中心
Golang中的Map
1、1 Map簡(jiǎn)介

企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對(duì)外擴(kuò)展宣傳的重要窗口,一個(gè)合格的網(wǎng)站不僅僅能為公司帶來(lái)巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺(tái),創(chuàng)新互聯(lián)建站面向各種領(lǐng)域:木托盤等成都網(wǎng)站設(shè)計(jì)、成都全網(wǎng)營(yíng)銷推廣解決方案、網(wǎng)站設(shè)計(jì)等建站排名服務(wù)。
Map是Golang中一種特殊的數(shù)據(jù)結(jié)構(gòu),它是一個(gè)鍵值對(duì)的集合,在Golang中,Map使用map[keyType]valueType的形式定義,其中keyType和valueType分別表示鍵和值的類型,我們可以定義一個(gè)String到int類型的Map:
m := make(map[string]int)
1、2 Map的創(chuàng)建
我們可以使用以下幾種方式創(chuàng)建Map:
使用make函數(shù)創(chuàng)建空Map:
m := make(map[string]int)
直接指定鍵值對(duì)初始化Map:
m := map[string]int{"apple": 1, "banana": 2}
使用字面量初始化Map:
m := map[string]int{"apple": 1, "banana": 2, "orange": 3}
1、3 Map的常用操作
添加鍵值對(duì):
m["apple"] = 100
獲取鍵對(duì)應(yīng)的值:
value := m["apple"]
刪除鍵值對(duì):
delete(m, "apple")
判斷鍵是否存在:
value, ok := m["apple"]
if ok {
fmt.Println("存在")
} else {
fmt.Println("不存在")
}
遍歷Map:
for key, value := range m {
fmt.Println("key:", key, "value:", value)
}
Golang中的Slice
2、1 Slice簡(jiǎn)介
Slice是Golang中一種特殊的數(shù)據(jù)結(jié)構(gòu),它是一個(gè)有序的、動(dòng)態(tài)大小的數(shù)據(jù)集合,在Golang中,Slice使用[]interface{}或者[]T的形式定義,]interface{}表示任意類型的切片,[]T表示固定類型的切片,我們可以定義一個(gè)Int類型的Slice:
slice := []int{1, 2, 3}
2、2 Slice的創(chuàng)建與初始化
我們可以使用以下幾種方式創(chuàng)建Slice:
使用make函數(shù)創(chuàng)建空Slice:
slice := make([]int, 0) // 長(zhǎng)度為0的空Slice,底層存儲(chǔ)空間為cap(0)*elemSize(0),容量為0,實(shí)際存儲(chǔ)空間為0字節(jié);如果不指定長(zhǎng)度參數(shù),默認(rèn)長(zhǎng)度為0,當(dāng)元素被添加到slice時(shí),底層會(huì)重新分配內(nèi)存空間,如果需要頻繁地添加或刪除元素,建議使用make創(chuàng)建slice時(shí)指定其容量。slice := make([]int, 5),表示創(chuàng)建一個(gè)長(zhǎng)度為5的空Slice,由于底層存儲(chǔ)空間未分配,因此實(shí)際存儲(chǔ)空間仍為0字節(jié),當(dāng)添加第一個(gè)元素后,底層存儲(chǔ)空間的大小將變?yōu)?*elemSize(4),后續(xù)添加元素時(shí),底層存儲(chǔ)空間會(huì)根據(jù)當(dāng)前元素個(gè)數(shù)自動(dòng)擴(kuò)容,如果需要指定初始容量和容量增長(zhǎng)因子等參數(shù),可以使用如下形式:slice := make([]int, initialCap, growthFactor),其中initialCap表示初始容量,growthFactor表示容量增長(zhǎng)因子。slice := make([]int, 5, 1.5),表示創(chuàng)建一個(gè)長(zhǎng)度為5的Slice,容量增長(zhǎng)因子為1.5,當(dāng)添加第6個(gè)元素時(shí),底層存儲(chǔ)空間的大小將變?yōu)?*elemSize(4)+1(擴(kuò)容空間),擴(kuò)容后的底層存儲(chǔ)空間大小為5*elemSize(4)+1,同理,后續(xù)添加元素時(shí),底層存儲(chǔ)空間會(huì)根據(jù)當(dāng)前元素個(gè)數(shù)自動(dòng)擴(kuò)容,如果需要指定初始容量、容量增長(zhǎng)因子以及底層存儲(chǔ)空間大小等參數(shù),可以使用如下形式:slice := make([]int, initialCap, growthFactor, capacity),其中capacity表示底層存儲(chǔ)空間大小。slice := make([]int, 5, 1.5, 64),表示創(chuàng)建一個(gè)長(zhǎng)度為5的Slice,容量增長(zhǎng)因子為1.5,底層存儲(chǔ)空間大小為64字節(jié),需要注意的是,當(dāng)?shù)讓哟鎯?chǔ)空間大小不足以容納新元素時(shí),會(huì)觸發(fā)一次realloc操作進(jìn)行擴(kuò)容,如果不需要指定底層存儲(chǔ)空間大小等參數(shù),可以使用如下形式:slice := make([]int),表示創(chuàng)建一個(gè)長(zhǎng)度為0的空Slice,由于底層存儲(chǔ)空間未分配,因此實(shí)際存儲(chǔ)空間仍為0字節(jié),當(dāng)添加第一個(gè)元素后,底層存儲(chǔ)空間的大小將變?yōu)閘en(slice)*elemSize(4),后續(xù)添加元素時(shí),底層存儲(chǔ)空間會(huì)根據(jù)當(dāng)前元素個(gè)數(shù)自動(dòng)擴(kuò)容,當(dāng)添加第n個(gè)元素時(shí),底層存儲(chǔ)空間的大小將變?yōu)閘en(slice)*elemSize(4)+n*elemSize(4)(擴(kuò)容空間),擴(kuò)容后的底層存儲(chǔ)空間大小為len(slice)*elemSize(4)+n*elemSize(4),同理,后續(xù)添加元素時(shí),底層存儲(chǔ)空間會(huì)根據(jù)當(dāng)前元素個(gè)數(shù)自動(dòng)擴(kuò)容,如果需要指定初始容量、容量增長(zhǎng)因子以及底層存儲(chǔ)空間大小等參數(shù),可以使用如下形式:slice := make([]int, initialCap, growthFactor),其中initialCap表示初始容量,growthFactor表示容量增長(zhǎng)因子。slice := make([]int, 5, 1.5),表示創(chuàng)建一個(gè)長(zhǎng)度為5的Slice,容量增長(zhǎng)因子為1.5,當(dāng)添加第6個(gè)元素時(shí),底層存儲(chǔ)空間的大小將變?yōu)?*elemSize(4)+1(擴(kuò)容空間),擴(kuò)容后的底層存儲(chǔ)空間大小為5*elemSize(4)+1,同理,后續(xù)添加元素時(shí),底層存儲(chǔ)空間會(huì)根據(jù)當(dāng)前元素個(gè)數(shù)自動(dòng)擴(kuò)容,如果需要指定初始容量、容量增長(zhǎng)因子以及底層存儲(chǔ)空間大小等參數(shù),可以使用如下形式:slice := make([]int, initialCap, growthFactor),其中initialCap表示初始容量,growthFactor表示容量增長(zhǎng)因子。slice := make([]int, 5, 1.5),表示創(chuàng)建一個(gè)長(zhǎng)度為5的Slice,容量增長(zhǎng)因子為1.5,當(dāng)添加第6個(gè)元素時(shí),底層存儲(chǔ)空間的大小將變?yōu)?*elemSize(4)+1(擴(kuò)容空間),擴(kuò)容后的底層存儲(chǔ)空間大小為5*elemSize(4)+1,同理,后續(xù)添加元素時(shí),底層存儲(chǔ)空間會(huì)根據(jù)當(dāng)前元素個(gè)數(shù)自動(dòng)擴(kuò)容,如果需要指定初始容量、容量增長(zhǎng)因子以及底層存儲(chǔ)空間大小等參數(shù),可以使用如下形式:slice := make([]int),表示創(chuàng)建一個(gè)長(zhǎng)度為0的空Slice,由于底層存儲(chǔ)空間未分配,因此實(shí)際存儲(chǔ)空間仍為0字節(jié),當(dāng)添加第一個(gè)元素后,底層存儲(chǔ)空間的大小將變?yōu)閘en(slice)*elemSize(4),后續(xù)添加元素時(shí),底層存儲(chǔ)空間會(huì)根據(jù)當(dāng)前元素個(gè)數(shù)自動(dòng)擴(kuò)容,當(dāng)添加第n個(gè)元素時(shí),底層存儲(chǔ)空間的大小將變?yōu)閘en(slice)*elemSize(4)+n*elemSize(4)(擴(kuò)容空間),擴(kuò)容后的底層存儲(chǔ)空間大小為len(slice)*elemSize(4)+n*elemSize(4),同理,后續(xù)添加元素時(shí),底層存儲(chǔ)空間會(huì)根據(jù)當(dāng)前元素個(gè)數(shù)自動(dòng)擴(kuò)容,如果需要指定初始容量、容量增長(zhǎng)因子以及底層存儲(chǔ)空間大小等參數(shù),可以使用如下形式:slice := make([]*T)(cap(*T)),T表示任意類型。slice := make([]*int)(cap(*int)),表示創(chuàng)建一個(gè)長(zhǎng)度為cap(*int)的Slice,底層存儲(chǔ)類型為int,注意:由于底層類型不確定且動(dòng)態(tài)變化,因此該方法無(wú)法保證創(chuàng)建出的Slice具有正確的類型信息,因此建議在創(chuàng)建Slice時(shí)指定其類型信息。slice := make([]*float64](len), cap(*float64)),表示創(chuàng)建一個(gè)長(zhǎng)度為len、容量為cap的Float64類型的Slice,其中l(wèi)en表示Slice的初始長(zhǎng)度,需要注意的是:由于Slice是一種引用類型而不是值類型,因此在使用make函數(shù)創(chuàng)建Slice時(shí)需要注意其返回值是一個(gè)指向內(nèi)部數(shù)據(jù)的指針而非實(shí)際的Slice對(duì)象本身,因此在使用完Slice后應(yīng)及時(shí)將其置為nil以釋放內(nèi)存資源:defer slice.Close() 或者 defer func() { slice = nil }(),否則可能導(dǎo)致內(nèi)存泄漏等問(wèn)題,另外需要注意的是:由于Slice是一種引用類型而不是值類型
文章標(biāo)題:Golang中的Map和Slice的操作技巧
網(wǎng)頁(yè)路徑:http://www.dlmjj.cn/article/dhhohpc.html


咨詢
建站咨詢
