中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

go切片的概念及用法

這篇文章主要介紹“go切片的概念及用法”,在日常操作中,相信很多人在go切片的概念及用法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”go切片的概念及用法”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)擁有一支富有激情的企業(yè)網(wǎng)站制作團隊,在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕10年,專業(yè)且經(jīng)驗豐富。10年網(wǎng)站優(yōu)化營銷經(jīng)驗,我們已為上千家中小企業(yè)提供了網(wǎng)站制作、成都網(wǎng)站設(shè)計解決方案,按需網(wǎng)站開發(fā),設(shè)計滿意,售后服務(wù)無憂。所有客戶皆提供一年免費網(wǎng)站維護!

go切片原型

// runtime/slice.gotype slice struct {
   array unsafe.Pointer// 引用底層數(shù)組的指針   len   int// 引用數(shù)組元素的長度,使用下標對元素進行訪問的時候,下標不能超過len 
   cap   int // 引用數(shù)組的容量,cap>=len}

定義一個名為baseSlice 的切片

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

底層結(jié)構(gòu)

go切片的概念及用法

定義一個新的切片slice1

slice1 := baseSlice[2:5] //[]int{2,3,4}

底層結(jié)構(gòu)

定義一個新的切片slice2

slice2 := slice1[4:7] //[]int{6,7,8}

底層結(jié)構(gòu)

go切片的概念及用法

源碼

package mainimport ("fmt")func main() {baseSlice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}slice1 := baseSlice[2:5] //[]int{2,3,4}    //這里slice1 cap是8,底層引用的數(shù)組為[]int{2, 3, 4, 5, 6, 7, 8, 9}    //所以slice1 len=3, cap=8    //由于 slice1 cap=8 所以slice1[4:7]并不會發(fā)生數(shù)組越界    slice2 := slice1[4:7]                                                     //[]int{6,7,8}    fmt.Printf("slice1:%v.len:%d.cap:%d\n", slice1, len(slice1), cap(slice1)) //slice1:[2 3 4].len:3.cap:8    fmt.Printf("slice2:%v.len:%d.cap:%d\n", slice2, len(slice2), cap(slice2)) //slice2:[6 7 8].len:3.cap:4}

切片是值傳遞

package mainimport ("fmt")func main() {baseSlice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}slice1 := baseSlice[2:5] //[]int{2,3,4}    appendSlice(slice1)fmt.Printf("slice1:%v\n", slice1)       //slice1:[2 3 4]    fmt.Printf("baseSlice:%v\n", baseSlice) //baseSlice:[0 1 2 3 4 10 6 7 8 9]}func appendSlice(s []int) { //值傳遞    s = append(s, 10)                   //這里會改變底層數(shù)組里的值,如果append的元素個數(shù)大于底層引用數(shù)組的容量,則會觸發(fā)一次數(shù)組copy    fmt.Printf("append slice1:%v\n", s) //append slice1:[2 3 4 10]}

go切片的概念及用法

引用傳遞的假象

如果在調(diào)用的方法里,修改了傳入切片len內(nèi)的值,導(dǎo)致底層數(shù)組對應(yīng)的值被修改,從調(diào)用方法外看,就像傳入的切片值被修改了。

package mainimport ("fmt")func main() {baseSlice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}slice1 := baseSlice[2:5] //[]int{2,3,4}    appendSlice(slice1)fmt.Printf("slice1:%v\n", slice1)       //slice1:[123 3 4],看起來是slice1被修改了,其實是由于底層數(shù)組被修改的緣故    fmt.Printf("baseSlice:%v\n", baseSlice) //baseSlice:[0 1 123 3 4 5 6 7 8 9]}func appendSlice(s []int) { //值傳遞    // s = append(s, 10)    s[0] = 123                                                          //這里會改變底層數(shù)組里的值    fmt.Printf("append slice1:%v. len=%d. cap=%d\n", s, len(s), cap(s)) //append slice1:[123 3 4]. len=3. cap=8}

go切片的概念及用法

深度copy

package mainimport ("fmt")func main() {baseSlice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}slice1 := baseSlice[4:7]          //[]int{6,7,8}    fmt.Printf("slice1:%v\n", slice1) //slice1:[4 5 6]    //slice 深copy    slice2 := make([]int, 3, 3)copy(slice2, slice1)fmt.Printf("slice2:%v. len=%d. cap=%d\n", slice2, len(slice2), cap(slice2)) //slice2:[4 5 6]. len=3. cap=3    slice2[0] = 100fmt.Printf("slice2:%v\n", slice2)       //slice2:[100 5 6]    fmt.Printf("slice1:%v\n", slice1)       //slice1:[4 5 6]    fmt.Printf("baseSlice:%v\n", baseSlice) //baseSlice:[0 1 2 3 4 5 6 7 8 9]}

go切片的概念及用法

擴容

// runtime/slice.go//cap 為滿足存放數(shù)據(jù)的最小容量func growslice(et *_type, old slice, cap int) slice {
   ...
   if cap > doublecap {  newcap = cap
   } else {  if old.len < 1024 {//如果slice len<1024,擴容時容量增長2倍,也就是2個變4個         newcap = doublecap  } else {//如果slice len>=1024,擴容時增加原來容量的四分之一         // Check 0 < newcap to detect overflow         // and prevent an infinite loop.         for 0 < newcap && newcap < cap {newcap += newcap / 4 } ...  }
   }

nil slice和empty slice

empty slice 底層數(shù)組指針指向?qū)嶋H存在的空數(shù)組的地址;

nil slice 底層數(shù)組指針指向的是nil;

package main

import (
    "fmt"
)

func main() {
    var nilSlice []int
    emptySlice := make([]int, 0)
    if emptySlice == nil {
        fmt.Println("emptySlice is nil.")
    }
    if nilSlice == nil {
        fmt.Println("nilSlice is nil.") //輸出 nilSlice is nil.
    }
}

tips:

Go 語言的函數(shù)參數(shù)傳遞,只有值傳遞。

到此,關(guān)于“go切片的概念及用法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

分享標題:go切片的概念及用法
網(wǎng)站網(wǎng)址:http://www.rwnh.cn/article18/jishdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、電子商務(wù)、手機網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、微信小程序、用戶體驗

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
琼海市| 榆社县| 绥江县| 梓潼县| 全南县| 隆子县| 赤水市| 三原县| 通江县| 辉县市| 安义县| 水城县| 兴业县| 邢台县| 祁门县| 大足县| 开江县| 河东区| 阜平县| 鄱阳县| 喀喇| 黔江区| 蓬莱市| 常宁市| 常州市| 莱芜市| 宜川县| 宝清县| 鹤壁市| 大同县| 陵川县| 苍梧县| 辽阳县| 肥城市| 禄劝| 庆云县| 洮南市| 绵阳市| 栖霞市| 郴州市| 武山县|