菜鳥系列Golang學習 — 數組

數組簡介

數組是咱們開發者常用的數據結構,本節將針對Golang源碼介紹數組。首先在咱們定義數組時,數組類型、長度都已經肯定了。而底層計算機則是爲數組分配一塊連續的內存來保存數組元素。咱們能夠快速的經過數組下標索引訪問數組元素。一維數組以下圖所示:數組

在Golang中,咱們定義數組:數據結構

var array [10]int

接下來,將結合源碼介紹Golang數組。code

1. 數組初始化

數組在建立時能夠直接初始化blog

var array = [4]int{1,2,3,4} // 顯式指定長度
var array = [...]int{1,2,3,4} // 須要在代碼編譯期間,由源代碼肯定

這兩種方式是最後的結果是相同的,第二種方式會由編譯器編譯代碼時轉換成上一種方式。
第一種方式會直接調用下列代碼建立數組索引

// NewArray returns a new fixed-length array Type.
func NewArray(elem *Type, bound int64) *Type {
    if bound < 0 {
        Fatalf("NewArray: invalid bound %v", bound)
    }
    t := New(TARRAY)
    t.Extra = &Array{Elem: elem, Bound: bound}
    t.SetNotInHeap(elem.NotInHeap())
    return t
}

其中,Type表明數組元素類型,bound表明數組長度。而且數組的位置是在堆或者棧也肯定了。內存

而第二種方式則會調用下列代碼進行建立element

// NewDDDArray returns a new [...]T array Type.
func NewDDDArray(elem *Type) *Type {
    t := New(TARRAY)
    t.Extra = &Array{Elem: elem, Bound: -1}
    t.SetNotInHeap(elem.NotInHeap())
    return t
}

其中,-1只是一個佔位符。具體數組長度是在類型檢查階段經過遍歷數組元素進行肯定的。開發

2. 數組的訪問

數組是一段連續的內存空間,經過下標咱們就能夠快速訪問,若是訪問越界,會報錯。在Golang中,越界錯誤會在編譯期間就會經過類型檢查被發現。編譯器

case OINDEX:
        case TSTRING, TARRAY, TSLICE:
            ...
            if n.Right.Type != nil && !n.Right.Type.IsInteger() {
                yyerror("non-integer %s index %v", why, n.Right)
                break
            }

            if !n.Bounded() && Isconst(n.Right, CTINT) {
                x := n.Right.Int64()
                if x < 0 {
                    yyerror("invalid %s index %v (index must be non-negative)", why, n.Right)
                } else if t.IsArray() && x >= t.NumElem() {
                    yyerror("invalid array index %v (out of bounds for %d-element array)", n.Right, t.NumElem())
                ...
            }

若是訪問越界就會直接報錯。源碼

  1. 訪問數組的索引是非整數時會直接報錯
  2. 訪問數組的索引是負數時會直接報錯
  3. 訪問數組的索引越界時會直接報錯

這些錯誤在咱們開發過程當中使用常量訪問數組就會直接報錯。

相關文章
相關標籤/搜索