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

Go之集合slice的實現(xiàn)

 更新時間:2021年08月31日 15:34:00   作者:小碼哥Damon  
本文主要介紹了Go之集合slice的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Slice(切片)

切片和數(shù)組類似,可以把它理解為動態(tài)數(shù)組。切片是基于數(shù)組實現(xiàn)的,它的底層就是一個數(shù)組。對數(shù)組任意分隔,就可以得到一個切片?,F(xiàn)在我們通過一個例子來更好地理解它,同樣還是基于前面的 array。

基于數(shù)組生成切片

下面代碼中的 array[2:5] 就是獲取一個切片的操作,它包含從數(shù)組 array 的索引 2 開始到索引 5 結(jié)束的元素:

array:=[5]string{"a","b","c","d","e"}
slice:=array[2:5]
fmt.Println(slice)

注意:這里是包含索引 2,但是不包含索引 5 的元素,即在 : 右邊的數(shù)字不會被包含。

//基于數(shù)組生成切片,包含索引start,但是不包含索引end

slice:=array[start:end]

所以 array[2:5] 獲取到的是 c、d、e 這三個元素,然后這三個元素作為一個切片賦值給變量 slice。

切片和數(shù)組一樣,也可以通過索引定位元素。這里以新獲取的 slice 切片為例,slice[0] 的值為 c,slice[1] 的值為 d。
有沒有發(fā)現(xiàn),在數(shù)組 array 中,元素 c 的索引其實是 2,但是對數(shù)組切片后,在新生成的切片 slice 中,它的索引是 0,這就是切片。雖然切片底層用的也是 array 數(shù)組,但是經(jīng)過切片后,切片的索引范圍改變了。

通過下圖可以看出,切片是一個具備三個字段的數(shù)據(jù)結(jié)構(gòu),分別是指向數(shù)組的指針 data,長度 len 和容量 cap:

這里有一些小技巧,切片表達式 array[start:end] 中的 start 和 end 索引都是可以省略的,如果省略 start,那么 start 的值默認為 0,如果省略 end,那么 end 的默認值為數(shù)組的長度。如下面的示例:

  • array[:4] 等價于 array[0:4]。
  • array[1:] 等價于 array[1:5]。
  • array[:] 等價于 array[0:5]。

切片修改

切片的值也可以被修改,這里也同時可以證明切片的底層是數(shù)組。
對切片相應的索引元素賦值就是修改,在下面的代碼中,把切片 slice 索引 1 的值修改為 f,然后打印輸出數(shù)組 array:

slice:=array[2:5]
slice[1] ="f"
fmt.Println(array)

可以看到如下結(jié)果:

[a b c f e]

數(shù)組對應的值已經(jīng)被修改為 f,所以這也證明了基于數(shù)組的切片,使用的底層數(shù)組還是原來的數(shù)組,一旦修改切片的元素值,那么底層數(shù)組對應的值也會被修改。

切片聲明

除了可以從一個數(shù)組得到切片外,還可以聲明切片,比較簡單的是使用 make 函數(shù)。
下面的代碼是聲明了一個元素類型為 string 的切片,長度是 4,make 函數(shù)還可以傳入一個容量參數(shù):

slice1:=make([]string,4)

在下面的例子中,指定了新創(chuàng)建的切片 []string 容量為 8:

slice1:=make([]string,4,8)

這里需要注意的是,切片的容量不能比切片的長度小。

切片的長度你已經(jīng)知道了,就是切片內(nèi)元素的個數(shù)。那么容量是什么呢?其實就是切片的空間。

上面的示例說明,Go 語言在內(nèi)存上劃分了一塊容量為 8 的內(nèi)容空間(容量為 8),但是只有 4 個內(nèi)存空間才有元素(長度為 4),其他的內(nèi)存空間處于空閑狀態(tài),當通過 append 函數(shù)往切片中追加元素的時候,會追加到空閑的內(nèi)存上,當切片的長度要超過容量的時候,會進行擴容。

切片不僅可以通過 make 函數(shù)聲明,也可以通過字面量的方式聲明和初始化,如下所示:

slice1:=[]string{"a","b","c","d","e"}
fmt.Println(len(slice1),cap(slice1))

可以注意到,切片和數(shù)組的字面量初始化方式,差別就是中括號 [] 里的長度。此外,通過字面量初始化的切片,長度和容量相同。

Append

我們可以通過內(nèi)置的 append 函數(shù)對一個切片追加元素,返回新切片,如下面的代碼所示:

//追加一個元素
slice2:=append(slice1,"f")
//多加多個元素
slice2:=append(slice1,"f","g")
//追加另一個切片
slice2:=append(slice1,slice...)

append 函數(shù)可以有以上三種操作,你可以根據(jù)自己的實際需求進行選擇,append 會自動處理切片容量不足需要擴容的問題。

小技巧:在創(chuàng)建新切片的時候,最好要讓新切片的長度和容量一樣,這樣在追加操作的時候就會生成新的底層數(shù)組,從而和原有數(shù)組分離,就不會因為共用底層數(shù)組導致修改內(nèi)容的時候影響多個切片。

切片元素循環(huán)

切片的循環(huán)和數(shù)組一模一樣,常用的也是 for range 方式,這里就不再進行舉例,當作練習題留給你。
在 Go 語言開發(fā)中,切片是使用最多的,尤其是作為函數(shù)的參數(shù)時,相比數(shù)組,通常會優(yōu)先選擇切片,因為它高效,內(nèi)存占用小。

到此這篇關于Go之集合slice的實現(xiàn)的文章就介紹到這了,更多相關Go 集合slice內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go+Kafka實現(xiàn)延遲消息的實現(xiàn)示例

    Go+Kafka實現(xiàn)延遲消息的實現(xiàn)示例

    本文主要介紹了Go+Kafka實現(xiàn)延遲消息的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Go語言實現(xiàn)的可讀性更高的并發(fā)神庫詳解

    Go語言實現(xiàn)的可讀性更高的并發(fā)神庫詳解

    這篇文章主要為大家介紹了Go語言實現(xiàn)的可讀性更高的并發(fā)神庫詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Go中變量命名規(guī)則與實例

    Go中變量命名規(guī)則與實例

    命名規(guī)則涉及變量、常量、全局函數(shù)、結(jié)構(gòu)、接口、方法等的命名,下面這篇文章主要給大家介紹了關于Go中變量命名的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • 淺談Golang的方法傳遞值應該注意的地方

    淺談Golang的方法傳遞值應該注意的地方

    這篇文章主要介紹了淺談Golang的方法傳遞值應該注意的地方,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 詳解Go語言如何實現(xiàn)一個最簡化的協(xié)程池

    詳解Go語言如何實現(xiàn)一個最簡化的協(xié)程池

    這篇文章主要為大家詳細介紹了Go語言如何實現(xiàn)一個最簡化的協(xié)程池,文中的示例代碼講解詳細,具有一定的參考價值,有需要的小伙伴可以了解一下
    2023-10-10
  • Go語言實戰(zhàn)之實現(xiàn)均衡器功能

    Go語言實戰(zhàn)之實現(xiàn)均衡器功能

    這篇文章主要為大家詳細介紹了如何利用Golang?實現(xiàn)一個簡單的流浪均衡器,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-04-04
  • go語言中的json與map相互轉(zhuǎn)換實現(xiàn)

    go語言中的json與map相互轉(zhuǎn)換實現(xiàn)

    本文主要介紹了go語言中的json與map相互轉(zhuǎn)換實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Golang設計模式之原型模式詳細講解

    Golang設計模式之原型模式詳細講解

    如果一個類的有非常多的屬性,層級還很深。每次構(gòu)造起來,不管是直接構(gòu)造還是用建造者模式,都要對太多屬性進行復制,那么有沒有一種好的方式讓我們創(chuàng)建太的時候使用體驗更好一點呢? 今天的文章里就給大家介紹一種設計模式,來解決這個問題
    2023-01-01
  • Go語言擴展原語之ErrGroup的用法詳解

    Go語言擴展原語之ErrGroup的用法詳解

    除標準庫中提供的同步原語外,Go語言還在子倉庫sync中提供了4種擴展原語,本文主要為大家介紹的是其中的golang/sync/errgroup.Group,感興趣的小伙伴可以了解一下
    2023-07-07
  • Go 實現(xiàn)一次性打包各個平臺的可執(zhí)行程序

    Go 實現(xiàn)一次性打包各個平臺的可執(zhí)行程序

    這篇文章主要介紹了Go 實現(xiàn)一次性打包各個平臺的可執(zhí)行程序,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

招远市| 甘孜| 海晏县| 忻州市| 上蔡县| 安图县| 淮安市| 普洱| 南充市| 东至县| 左云县| 邹平县| 新竹市| 温州市| 和田县| 巨野县| 巫溪县| 洛扎县| 六盘水市| 清苑县| 呼和浩特市| 黑龙江省| 察隅县| 正安县| 丰都县| 全州县| 禹城市| 罗平县| 博罗县| 宁夏| 大悟县| 开鲁县| 北海市| 关岭| 图们市| 乳源| 苍梧县| 隆尧县| 漯河市| 深圳市| 卢龙县|