<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] ### 數組 **** #### OverView 數組是具有相同唯一類型的一組已編號且長度固定的數據項序列。這種類型可以是任意的原始類型例如整型、字符串或者自定義類型。**數組長度**必須是一個**常量**表達式,并且必須是一個**非負整數**。 數組長度也是數組類型的一部分,所以\[5\]int和\[10\]int是屬于不同類型的。 ` ` #### 示例 一維數組聲明以及初始化常見方式如下: ``` var arrAge = [5]int{18, 20, 15, 22, 16} var arrName = [5]string{3: "Chris", 4: "Ron"} //指定索引位置初始化 // {"","","","Chris","Ron"} var arrCount = [4]int{500, 2: 100} //指定索引位置初始化 {500,0,100,0} var arrLazy = [...]int{5, 6, 7, 8, 22} //數組長度初始化時根據元素多少確定 var arrPack = [...]int{10, 5: 100} //指定索引位置初始化,數組長度與此有關 {10,0,0,0,0,100} var arrRoom [20]int var arrBed = new([20]int) ``` Go 語言中的數組是一種值類型(不像 C/C++ 中是指向首元素的指針),所以可以通過 new() 來創建: ``` var arr1 = new([5]int) ``` 那么這種方式和 var arr2 \[5\]int 的區別是什么呢?arr1 的類型是 \*\[5\]int,而 arr2的類型是 \[5\]int。在Go語言中,數組的長度都算在類型里。 由于把一個大數組傳遞給函數會消耗很多內存(值傳遞),在實際中我們通常有兩種方法可以避免這種現象: ``` 傳遞數組的指針 使用切片 ``` ` ` #### 多維數組 在定義多維數組時,僅第一維允許使用“…”,而內置函數len和cap也都返回第一維度長度。定義數組時使用“…”表示長度,表示初始化時的實際長度來確定數組的長度。 ``` b := [...][5]int{ { 10, 20 }, { 30, 40, 50, 60 } } fmt.Println(b[1][3], len(b)) //60 2 ``` 遍歷數組 ``` var arrAge = [5]int{18, 20, 15, 22, 16} for i, v := range arrAge { fmt.Printf("%d 的年齡: %d\n", i, v) } ``` ` ` ### 切片 ***** **切片(slice)**是對底層數組一個連續片段的引用(該數組我們稱之為相關數組,通常是匿名的),所以切片是一個**引用類型**(和數組不一樣)。切片提供對該數組中編號的元素序列的訪問。 切片類型表示其元素類型的所有數組切片的集合。未初始化切片的值為nil。 切片具有長度和容量,**與數組不同,切片的長度可能在執行期間發生變化**,切片提供了計算容量的函數 cap() ,可以測量切片最大長度。切片的長度永遠不會超過它的容量,所以對于切片 s 來說,這個不等式永遠成立:0 <= len(s) <= cap(s)。 #### 優點 因為切片是引用,所以它們不需要使用額外的內存并且比使用數組更有效率: ``` var x = []int{2, 3, 5, 7, 11} var slice1 []type = make([]type, len,cap) ``` 也可以簡寫為 slice1 := make([]type, len),這里 len 是數組的長度并且也是 slice 的初始長度。cap是容量,其中 cap 是可選參數。 ``` v := make([]int, 10, 50) ``` 如果從數組或者切片中生成一個新的切片,我們可以使用下面的表達式: **a[low : high : max]** max-low的結果表示容量,high-low的結果表示長度。 ``` a := [5]int{1, 2, 3, 4, 5} t := a[1:3:5] ``` #### 切片重組 ``` slice1 := make([]type, start_length, capacity) ``` 通過改變切片長度得到新切片的過程稱之為切片重組 reslicing,做法如下:slice1 = slice1[0:end],其中 end 是新的末尾索引(即長度)。 ` ` 當我們在一個slice基礎上重新劃分一個slice時,新的slice會繼續引用原有slice的數組,我們應該避免分配大量臨時的slice用于創建新的slice 來引用原有數據的一小部分。 錯誤示范: ``` package main import "fmt" func get() []byte { raw := make([]byte, 10000) fmt.Println(len(raw), cap(raw), &raw[0]) // 顯示: 10000 10000 數組首字節地址 return raw[:3] // 10000個字節實際只需要引用3個,其他空間浪費 } func main() { data := get() fmt.Println(len(data), cap(data), &data[0]) // 顯示: 3 10000 數組首字節地址 } ``` 為了避免這個陷阱,我們需要從臨時的slice中使用內置函數copy(),拷貝數據(而不是重新劃分slice)到新切片。 ``` package main import "fmt" func get() []byte { raw := make([]byte, 10000) fmt.Println(len(raw), cap(raw), &raw[0]) // 顯示: 10000 10000 數組首字節地址 res := make([]byte, 3) copy(res, raw[:3]) // 利用copy 函數復制,raw 可被GC釋放 return res } func main() { data := get() fmt.Println(len(data), cap(data), &data[0]) // 顯示: 3 3 數組首字節地址 } ``` ` ` append()內置函數: ``` func append(s S, x ...T) S // T是S元素類型 ``` Append()函數將相同類型S的元素追加到切片s后面并且返回新的切片。 如果 s 的容量不足以存儲新增元素,append 會分配新的切片來保證已有切片元素和新增元素的存儲。 append()函數返回的切片可能已經指向一個不同的相關數組了。append()函數總是返回成功,除非系統內存耗盡了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看