(二十六)golang--切片


基本介紹:程序員

  • 切片是數組的引用;
  • 切片的使用和數組相似;
  • 切片的長度是能夠變化的;
  • 切片的定義 var a []int,注意和數組定義的區別;

切片不只能夠使用len函數,還有cap函數來計算切片的容量;數組

切片在內存中的形式:數據結構

 

 

 

 

 

 從該圖咱們能夠得出:app

  • slice的確是一個引用類型;
  • slice從底層來講,其實就是一個數據結構struct:
    type slice sruct {
      ptr *[2]int
      len int
      cap int
    }

切片使用的三種方式:ide

  • 即上面的對數組的操做;
  • 經過make來建立切片;var slice []int = make([]int,4,20)三個參數分別是類型,長度,容量
  • 定義一個切片,直接就指定數組;var slice []int = []int{1,3,5}

方式1和方式2的區別:函數

方式1是直接引用數組,這個數組是事先存在的,程序員是可見的;方式2經過make,make也會建立一個數組,是由切片在底層進行維護,對程序員是不可見的;3d

切片的遍歷:與數組同樣,也是有兩種;blog

 切片使用的注意事項:內存

  • 切片定義後須要引用到一個數組或者make一個空間供切片使用;
  • 切片以後能夠繼續切片;
  • append內置函數,能夠動態增長切片;
    var slice []int = []int{1,2,3}
    slice = append(slice,4,5,6)
    slice = append(slice,slice...);注意三個...是固定操做

切片append底層原理分析:
(1)切片append本質上是對數組擴容;字符串

(2)go語言會建立一個新的數組(擴容後)

(3)將slice原來包含的元素拷貝到新的數組;

(4)slice從新引用到新數組;

(5)新數組是在底層來維護的,程序員不可見;

切片的拷貝操做:
切片使用copy內置函數完成拷貝;

intArr和intArr2空間是相互獨立的,相互之間不會影響;

若元素不夠,則只拷貝一部分;

 

 

 string和切片的關係:

(1)string底層實現是一個byte數組,所以string也能夠進行切片;

(2)string是不可變的;

(3)若是要修改字符串,先要將string-->[]byte,或者[]rune-->修改-->重寫裝成string;要替換中文,用[]rune;

相關文章
相關標籤/搜索