GO基礎之切片

1、什麼是切片

Go語言切片是對數組的抽象。數組

  • Go數組的長度不可改變,在特定場景中這樣的集合就不太適用,Go中提供了一種靈活,功能強悍的內置類型切片("動態數組");
  • 與數組相比切片的長度是不固定的,能夠追加元素,在追加時可能使切片的容量增大。
  • 切片自己沒有任何數據,它們只是對現有數組的引用。
  • 切片與數組相比,不須要設定長度,在[ ]中不用設定值,相對來講比較自由
  • 從概念上面來講slice像一個結構體,這個結構體包含了三個元素:

切片的結構:app

  • 〇指針,指向數組中slice指定的開始位置
  • 〇長度,SPslice的長度
  • 〇最大長度,也就是slice開始位置到數組的最後位置的長度

2、切片的使用

切片的聲明ide

 

    s1 := make([]int, 5)
    s2 := make([]int, 5, 7)

 

切片的初始化:函數

 

 

nums := []int{1, 2, 3, 4, 5}

len()和cap()函數spa

一、 切片的長度是切片中元素的數量。指針

二、 切片的容量是從建立切片的索引開始的底層數組中元素的數量。code

三、 切片是可索引的,而且能夠由len()方法獲取長度,切片提供了計算容量的方 法cap(),能夠測量切片最長能夠達到多少。[數組計算cap()結果與len()相同]blog

四、 切片實際的是獲取數組的某一部分,len切片<=cap切片<=len數組 索引

package main

import "fmt"

func main() {
    s1 := make([]int, 5)
    s2 := make([]int, 5, 7)
    printSlice(s1) //length:5,cap=5,slice=[0 0 0 0 0]
    printSlice(s2) //length:5,cap=7,slice=[0 0 0 0 0]
    //建立切片
    nums := []int{1, 2, 3, 4, 5}
    printSlice(nums)
    //從切片中截取小切片
    nums1 := nums[1:4]
    printSlice(nums1) //length:3,cap=4,slice=[2 3 4] 
    nums2 := nums[:3]
    printSlice(nums2) //length:3,cap=5,slice=[1 2 3]
    nums3 := nums[2:]
    printSlice(nums3) //length:3,cap=3,slice=[3 4 5]
}
func printSlice(slc []int) {
    fmt.Printf("length:%d,cap=%d,slice=%v \n", len(slc), cap(slc), slc)
}
View Code

 

 3、切片的經常使用函數

(五)、append( ) 和 copy( )函數 內存

一、函數append( ):

  • •往切片中追加新元素
  • •能夠向 slice裏面追加一個或者多個元素,也能夠追加一個切片。
  • • append函數會改變slice所引用的數組的內容,從而影響到引用同一數組的 其它slice。
  • •當使用 append追加元素到切片時,若是容量不夠(也就是(cap-len)== 0),Go就會建立一個新的內存地址來儲存元素(該方式效率較低)。

二、函數copy:*複製切片元素

  • •將源切片中的元素複製到目標切片中,返回複製的元素的個數
  • • copy方法是不會創建源切片與目標切片之間的聯繫。也就是兩個切片不存 在聯繫,一個修改不影響另外一個。
package main

import "fmt"

func main() {
    //建立切片
    nums := []int{1, 2, 3, 4, 5}
    printSlice("nums", nums) //slice=nums,p=0xc00000c5d0,length:5,cap=5,slice=[1 2 3 4 5]
    //append 追加元素
    nums = append(nums, 10)
    printSlice("nums", nums) //slice=nums,p=0xc000014230,length:6,cap=10,slice=[1 2 3 4 5 10]
    a := []int{6, 7, 8, 9}
    //追加數組
    nums = append(nums, a...)
    printSlice("nums", nums) //slice=nums,p=0xc000014230,length:10,cap=10,slice=[1 2 3 4 5 10 6 7 8 9]
    //刪除第一個元素
    nums = nums[1:]
    printSlice("nums", nums) //slice=nums,p=0xc000014238,length:9,cap=9,slice=[2 3 4 5 10 6 7 8 9]
    //刪除最後一個元素
    nums = nums[:len(nums)-1]
    printSlice("nums", nums) //slice=nums,p=0xc000014238,length:8,cap=9,slice=[2 3 4 5 10 6 7 8]
    //刪除中間的元素
    b := int(len(nums) / 2)
    nums = append(nums[:b], nums[b+1:]...)
    printSlice("nums", nums) //slice=nums,p=0xc000014238,length:7,cap=9,slice=[2 3 4 5 6 7 8]

    //切片copy
    nums2 := make([]int, len(nums), cap(nums)*2)
    //copy 的切片沒有關聯
    copy(nums2, nums)
    printSlice("nums2", nums2) //slice=nums,p=0xc000014238,length:7,cap=9,slice=[2 3 4 5 6 7 8]

}
func printSlice(name string, slc []int) {
    fmt.Printf("slice=%v,p=%p,length:%d,cap=%d,slice=%v \n", name, slc, len(slc), cap(slc), slc)
}
View Code

三、使用make建立切片

package main

import "fmt"
import "strconv"

func main() {
    str := make([]string, 0, 16)
    printSlice("str", str)
    for i := 0; i < 5; i++ {
        str = append(str, strconv.Itoa(i))
    }
    printSlice("str", str)

}
func printSlice(name string, slc []string) {
    fmt.Printf("slice=%v,p=%p,length:%d,cap=%d,slice=%v \n", name, slc, len(slc), cap(slc), slc)
}
相關文章
相關標籤/搜索