go語(yǔ)言切片slice使用細(xì)節(jié)和注意事項(xiàng)整理大全
go語(yǔ)言中切片slice的使用是最為頻繁的,效率也是最高的, 今天就給大家說(shuō)說(shuō)我們?cè)谑褂眠^(guò)程中會(huì)忽略的一些細(xì)節(jié)。
先普及一下slice的核心基礎(chǔ)知識(shí), go語(yǔ)言中的切片是引用類(lèi)型, 其底層數(shù)據(jù)的存儲(chǔ)實(shí)際上是存儲(chǔ)在一個(gè)數(shù)組 上(這個(gè)和他的數(shù)據(jù)類(lèi)型 引用 是相關(guān)的 他底層就是引用的數(shù)組), 而數(shù)組的大小一旦定義其大小就是不可改變的,
使用建議:建議大家在使用切片的時(shí)候,如果是知道大小,那就在make的時(shí)候指定大小,然后通過(guò)下標(biāo)來(lái)使用, 如果不知道大小,希望通過(guò)append來(lái)動(dòng)態(tài)擴(kuò)容,那在定義的時(shí)候就不要使用make來(lái)初始化。
使用之前先初始化和分配內(nèi)存空間
slice := make([]string, 2) //定義cap容量為2的字符串切片 slice[0] = "hello" slice[1] = "golang"
用append函數(shù)將slice當(dāng)做動(dòng)態(tài)數(shù)組使用
var x []interface{} // 定義個(gè)空接口切片,注意切片如果定義后如果是使用append函數(shù)動(dòng)態(tài)增加元素,則不需要使用make初始化分配空間,因?yàn)閍ppend函數(shù)幫我們做了這個(gè)事情。 // 如果是定義后想直接通過(guò)下標(biāo)訪問(wèn)切片,則必須使用make初始化后才能使用下標(biāo)訪問(wèn)?。? //動(dòng)態(tài)增加元素, append會(huì)自動(dòng)幫我們初始化和分配內(nèi)存空間 x = append(x, "Hello golang")
定義切片的3種方式:
1. 從已有的數(shù)組中使用中括號(hào)[]和指定截取索引的位置來(lái)截取切片;
2. 使用 var 定義切片,然后使用append函數(shù)動(dòng)態(tài)擴(kuò)容;
3. 直接使用make構(gòu)建和初始化切片,然后通過(guò)下標(biāo)使用 注意不能越界??!
切片使用細(xì)節(jié)注意事項(xiàng)
1. 如果切片是從已有的數(shù)組截取來(lái)的, 在切片里面改變數(shù)據(jù)或者原來(lái)數(shù)組值改變的時(shí)候, 原來(lái)的數(shù)組或者截取后的切片的值也會(huì)相應(yīng)的改變,因?yàn)榍衅且玫臄?shù)組
2. 切片使用len獲取數(shù)據(jù)條數(shù), 使用cap獲取容量
切片的拷貝 注意事項(xiàng)
切片使用copy 內(nèi)置函數(shù)完成拷貝:func copy(dst, src []Type) int
dst 要拷貝到的目標(biāo)切片, src 拷貝數(shù)據(jù)的來(lái)源切片
var s4 = []int{7, 8, 9} var ss4 = make([]int, 2) // 注意這里的創(chuàng)建的切片長(zhǎng)度, 需要大于等于要拷貝的src的長(zhǎng)度 否則就只能拷貝這里的長(zhǎng)度個(gè)元素 copy(ss4, s4) fmt.Printf("ss2=%v\n", ss4) // ss2=[7 8] s4里面有3個(gè)元素,因?yàn)閟s4長(zhǎng)度為2 所以這里只拷貝了2個(gè)元素
總結(jié)
到此這篇關(guān)于go語(yǔ)言切片slice使用細(xì)節(jié)和注意事項(xiàng)整理大全的文章就介紹到這了,更多相關(guān)go語(yǔ)言切片slice使用注意事項(xiàng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go?集成nacos注冊(cè)中心、配置中心的過(guò)程詳解
這篇文章主要介紹了go集成nacos注冊(cè)中心、配置中心的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-12-12go語(yǔ)言代碼生成器code?generator使用示例介紹
這篇文章主要為大家介紹了go語(yǔ)言代碼生成器code?generator的使用簡(jiǎn)單介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05go將request?body綁定到不同的結(jié)構(gòu)體中教程
這篇文章主要為大家介紹了go將request?body綁定到不同的結(jié)構(gòu)體中教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Go 使用Unmarshal將json賦給struct出錯(cuò)的原因及解決
這篇文章主要介紹了Go 使用Unmarshal將json賦給struct出錯(cuò)的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Go 1.21新增的slices包中切片函數(shù)用法詳解
Go 1.21新增的 slices 包提供了很多和切片相關(guān)的函數(shù),可以用于任何類(lèi)型的切片,本文通過(guò)代碼示例為大家介紹了部分切片函數(shù)的具體用法,感興趣的小伙伴可以了解一下2023-08-08