golang復合資料型別 陣列

2021-10-18 03:24:48 字數 4039 閱讀 4759

顧名思義,復合資料型別就是由其他型別組合而成的型別。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函式 給結構體中的指標變數成員賦值時,要先給指標分...