顧名思義,復合資料型別就是由其他型別組合而成的型別。go語言基本的復合資料型別有:指標、陣列、切片、字典(map)、通道、結構和介面
go語言提供了陣列型別的資料結構。
陣列是具有相同唯一型別的一組編號且長度固定的資料項序列,這種型別可以是任意的原始型別,例如:整形、字串或者自定義型別。
陣列元素可以通過索引(位置)來讀取(或者修改),索引從0開始,第乙個元素索引為
0,第二個索引為1,以此類推,陣列的下標取值範圍是從0開始,到長度減1。
陣列語法:
//語法:
var variable_name[size] variable_type
var 陣列名 [長度] 資料型別
var 陣列名 = [長度] 資料型別
陣列名 := [...]資料型別
注:需要指明陣列的大小和儲存的資料型別。
示例**:
var array [10] int //宣告乙個有10個整型的陣列,元素預設值為0,此種方法很少使用
array := [...]float64 //[...]後面跟字面量初始化列表
初始化陣列中{}中的元素個數不能大於中的數字。
如果忽略中的數字不設定陣列大小,go語言會根據元素的個數來設定陣列的大小:
var array = int
arr[4] = 5
陣列的其它建立方式:
array := [4]int //指定長度和初始化字面量
array := [...]int //不指定長度,但是由後面的初始化列表數量來確定其長度
array := [4]int //指定總長度,並通過索引值進行初始化,沒有初始化元素時,使用型別預設值
array := [...]int //不指定總長度,通過索引值進行初始化,陣列長度由最後乙個索引值確定,沒有指定索引的元素被初始化為型別的零值
陣列訪問:
陣列名[index]
len() 取陣列長度,其它還可用於array/map/slice/string
cap() 取陣列容量
用法舉例:
len(陣列名)
cap(陣列名)
遍歷陣列:
package main
import "fmt"
func main()
for i :=0;i < len(array);i++
fmt.println(array)
}
使用range遍歷陣列
package main
import "fmt"
func main()
for i,v := range array
}
如果只需要值並希望忽略索引,那麼可以通過_blank識別符號替換索引來實現這一點。
package main
import "fmt"
func main()
for _,value := range array
}
在 golang 中,陣列是值型別,這意味著陣列也可以用在賦值操作中。變數名代表整個陣列,同型別的陣列可以賦值給另乙個陣列:
var arr1 [3]string
arr2 := [3]string
// 把 arr2 的賦值(其實本質上是複製)到 arr1
arr1 = arr2
複製完成後兩個陣列的值完全一樣,但是彼此之間沒有任何關係:
前面我們不止一次地提到:陣列的型別包括陣列的長度和陣列元素的型別。只有這兩部分都一樣才是相同型別的陣列,也才能夠互相賦值。下面的**中,在型別不同的陣列間賦值,編譯器會阻止這樣的操作並報錯:
// 宣告第乙個包含 4 個元素的字串陣列
var arr1 [4]
string
// 宣告第二個包含 3 個元素的字串陣列,並初始化
arr2 :=[3
]string
// 將 arr2 賦值給 arr1
arr1 = arr2
編譯以上**時,會報錯如下:
cannot use arr2 (type [3]string) as type [4]string in assignment
//編譯器表示在賦值時不能把 type [3]string 當 type [4]string 用。
把陣列賦值給其它陣列時,實際上是完整地複製乙個陣列。所以,如果陣列是乙個指標型的陣列,那麼複製的將是指標,而不會複製指標所指向的物件。看下面的**:
讓陣列中的元素具有一定順序
array := [...]int
公升序: array := [...]int
降序: array := [...]int
排序演算法:
氣泡排序、插入排序、選擇排序、希爾排序、堆排序、快速排序
氣泡排序:(bubbo sort)
依次比較兩個相鄰的元素,如果它們的順序(如從小到大)就把它們的位置進行交換
示例:
func
main()
for i :=
1;i<
len(array)
;i++
} fmt.
println
(array)
}}
go語言支援多維陣列,以下為常用的多維陣列宣告語法方式:
#常用的多維陣列宣告方式:
var variable_name[size] [size]...[size]variable_type
#以下例項宣告了三維的整型陣列:
var threedim [5][10][4]int
多維陣列可通過大括號來初始值。以下 宣告二維陣列的示例** :
// 宣告乙個二維整型陣列,兩個維度分別儲存 4 個元素和 2 個元素
var arr [4][2]int
// 使用陣列字面量來宣告並初始化乙個二維整型陣列
arr1 := [4][2]int, , , }
// 宣告並初始化外層陣列中索引為 1 和 3 的元素
arr2 := [4][2]int, 3: }
// 宣告並初始化外層陣列和內層陣列的單個元素
arr3 := [4][2]int, 3: }
下圖展示了上面**宣告的二維陣列在每次宣告並初始化後包含的值:
訪問二維陣列
二維陣列通過指定座標來訪問。如陣列中的行索引與列索引,例如:
int val = a[2][3]
此示例訪問了二維陣列 val 第三行的第四個元素。
陣列在 golang 中是作為高效能的基礎型別設計的,因此對使用者來說使用起來並不是特別方便,這一點在眾多的開源**中(陣列用的少,slice 用的多)可以得到印證。其實基於陣列實現的 slice 以其簡單靈活的特性更易於被大家接受,這也正是 golang 設計 slice 的初衷。本文介紹了陣列這個幕後大英雄,後面的文章會介紹 slice 的用法。 復合資料型別
復合資料型別 作用 封裝資料 多種不同型別資料存放在一起 應存放在全域性,在訪問結構體中的變數時,應用stu.id stu.name 初始化的方式 在對陣列進行初始化時 strcpy stu.name,zhangsan 在對指標進行初始化時 char name 對name進行初始化 stu.name...
復合資料型別
一 struct結構體 封裝資料 存放多種不同的資料型別 struct的宣告放在全域性區 1.宣告和定義 宣告 struct student struct student stu array 3 int i for i 0 i 3 i for i 0 i 3 i include struct stu...
復合資料型別
結構體 作用 封裝資料 把多種不同的資料型別放在一起 注意 一般放在全域性 分號不能省略。結構體變數用點訪問 結構體指標用 訪問 初始化 靜態初始化 動態初始化 使用注意事項 給結構體中的陣列成員賦值時,不能直接將字串賦給陣列名,可以使用strcpy函式 給結構體中的指標變數成員賦值時,要先給指標分...