golang 數組與切片分析

package main

import "fmt"

func main() {
   var q = [3]int{1, 2, 3}
   fmt.Println(q[2])
   //在數組的定義中,如果在數組長度的位置出現“...”省略號,則表示數組的長度是根據初始化值的個數來計算,
   var a = [...]int{2, 2, 2}
   fmt.Println(a)
   //多維數組
   //二維數組
   //聲明一個二維數組 二維長度爲 4 和 2
   var array [4][2]int
   array = [4][2]int{{10, 11}, {20, 21}, {30, 31}, {40, 41}}
   fmt.Println(array)
   //// 聲明並初始化數組中索引爲 1 和 3 的元素
   array = [4][2]int{1: {20, 21}, 3: {40, 41}}
   fmt.Println(array)
   //聲明並初始化數組中指定的元素
   array = [4][2]int{1: {0: 20}, 3: {1: 41}}
   fmt.Println(array)

   //數組和切片
   //切片是對數組的一個連續片段的引用.所以切片是一個引用類型
   //這個片段可以是整個數組,也可以是由起始和終止索引標識的一些項的子集,
   // 需要注意的是,終止索引標識的項不包括在切片內
   //從數組生成切片
   var arr = [3]int{1, 2, 3}
   fmt.Println(arr, arr[1:2])
   var highRiseBuilding [30]int
   for i := 0; i < 30; i++ {
      highRiseBuilding[i] = i + 1
   }
   // 區間 嘗試出租一個區間樓層。
   fmt.Println(highRiseBuilding[10:15])
   // 中間到尾部的所有元素 出租 20 層以上。
   fmt.Println(highRiseBuilding[20:])
   // 開頭到中間指定位置的所有元素 出租 2 層以下,一般是商用鋪面。
   fmt.Println(highRiseBuilding[:2])
   //生成新的切片變量
   //字符串切片
   var strArr []string
   //整型切片
   var numArr []int
   //聲明一個空切片
   var emptyArr = []int{}
   //輸出這三個切片
   fmt.Println(strArr, numArr, emptyArr)
   //切片判斷爲空
   fmt.Println(strArr == nil)
   fmt.Println(numArr == nil)
   //空切片 爲false 已經被分配到了內存,但沒有元素,因此和 nil 比較時是 false。
   fmt.Println(emptyArr == nil)

   //使用make 函數來構造切片
   //make( []Type, size, cap )
   //其中 Type 是指切片的元素類型,size 指的是爲這個類型分配多少個元素,cap 爲預分配的元素數量,
   // 這個值設定後不影響 size,只是能提前分配空間,降低多次分配空間造成的性能問題。
   //如果需要動態創建一個切片 可以使用make 內置函數
   var makeArr = make([]int, 2)
   fmt.Println(makeArr)
   makeArr_A := make([]int, 2, 5)
   fmt.Println(makeArr_A)

   //使用append 爲切片添加元素
   var appendArr []int
   appendArr = append(appendArr, 1)                 //追加一個
   appendArr = append(appendArr, 1, 2, 3)           //追加多個
   appendArr = append(appendArr, []int{1, 2, 3}...) //追加一個切片
   fmt.Println(appendArr)

   //除了在切片的尾部追加  也可以在切片的前面追加
   appendArr_1 := []int{1, 2, 3}
   appendArr_1 = append([]int{1, 2, 3}, appendArr_1...)
   fmt.Println(appendArr_1)
   //在切片開頭添加元素一般都會導致內存的重新分配,
   // 而且會導致已有元素全部被複制 1 次,因此,從切片的開頭添加元素的性能要比從尾部追加元素的性能差很多。

   //切片的複製
   //copy可以將一個數組切片 複製到另一個數組切片中
   //copy函數的使用格式
   //copy( destSlice, srcSlice []T) int
   //其中 srcSlice 爲數據來源切片,destSlice 爲複製的目標(也就是將 srcSlice 複製到 destSlice),
   // 目標切片必須分配過空間且足夠承載複製的元素個數,並且來源和目標的類型必須一致,copy() 函數的返回值表示實際發生複製的元素個數
   //下面的代碼展示了使用 copy() 函數將一個切片複製到另一個切片的過程:
   //slice1 := []int{1, 2, 3, 4, 5}
   //slice2 := []int{5, 4, 3}
   //copy(slice2, slice1) // 只會複製slice1的前3個元素到slice2中
   //copy(slice1, slice2) // 只會複製slice2的3個元素到slice1的前3個位置

   //go語言的多維切片
   //聲明一個二維切片
   var slice [][]int
   //爲二維切片 賦值
   slice = [][]int{{10}, {100, 200}}
   fmt.Println(slice)
   //取值
   fmt.Println(slice[1][:])
   //

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章