Go語言中的數組(array)和數組切片(slice)


        在Go語言中,數組長度在定義后就不可更改,在聲明時長度可以為一個常量或者一個常量表達式(常量表達式是指在編譯期即可計算結果的表達式)。數組的長度是該數組類型的一個內置常量,可以用Go語言的內置函數len()來獲取。

        數組的長度在定義后無法再次修改;數組是值類型,每次傳遞都產生一份副本。

        初看起來數組切片就像一個指向數組的指針,實際上它擁有自己的數據結構,而不僅僅是一個指針。數組切片的數據結構可以抽象為以下3個變量:

  • 一個指向原生數組的指針
  • 數組切片中元素的個數
  • 數組切片已分配的存儲空間

        從底層實現的角度看,數組切片實際上仍然使用數組來管理元素,基於數組,數組切片添加了一系列管理功能,可以隨時動態擴充存放空間,並且可以被隨意傳遞,而不會導致所管理的元素被復制。

下面用 reflect 包來反射出數據的類型。

 
 
 
         package main
 
import(
    "fmt"
    "reflect"
)
 
func main(){
 
    vs:=[]interface{}{
        []int{},// slice 切片
        []int{1,2,3},// slice 切片
        []int{1,2,3}[:],//切片再切還是切片
        make([]int,3,10),//標准的slice 定義方式
        [3]int{1,2,3},//array 數組,確定數組長度
        [...]int{1,2,3},//array 數組,由編譯器自動計算數組長度。
    }
    for i,v:=range vs{
        rv:=reflect.ValueOf(v)//進入瘋狂的reflect世界
        fmt.Println(i,rv.Kind())
    }
}

上述程序執行結果:

0 slice

1 slice

2 slice

3 slice

4 array

5 array

注意slice和數組在聲明時的區別:聲明數組時,方括號內寫明了數組的長度或使用...自動計算長度,而聲明slice時,方括號內沒有任何字符。

數組切片的擴容:

 

    ww:=make([]int,3,5)
    ww[0]=23
    ww[1]=23
    ww[2]=23
    //ww[3]=34// 這樣賦值會報錯誤 panic: runtime error: index out of range 超過了切片的大小
 
    fmt.Println(cap(ww))
    ww=append(ww,2,4,34)//需要用 append 給賦值, append 在存儲空間不足時,會自動增加存儲空間
    fmt.Println(cap(ww))
    fmt.Println(ww)

注:append函數會改變slice所引用的數組的內容,從而影響到引用同一數組的其它slice。 但當slice中沒有剩余空間(即(cap-len) == 0)時,此時將動態分配新的數組空間。返回的slice數組指針將指向這個空間,而原數組的內容將保持不變;其它引用此數組的slice則不受影響。

 

 

參考:
數組(Array)和切片(Slice)
http://my.oschina.net/lxpan/blog/87432 

Golang Go語言Array數組與Slice切片的不同
http://kejibo.com/golang-slice-array-reflect/

2.2 Go基礎 
https://github.com/astaxie/build-web-application-with-golang/blob/master/02.2.md 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM