快速修改陣列的某個值 Go語言資料結構 陣列知多少

2021-10-14 19:42:10 字數 1885 閱讀 4430

陣列作為重要的資料結構,在其他語言中應用很廣泛,但是在go中因為長度是陣列型別的一部分,決定了go語言的陣列的侷限性。今天我們就來聊一下go語言的陣列。

直接指明長度,定義乙個長度為4的陣列;

var arr [4]int // 元素預設為0

var arr1 [4]int=[4]int // 定義長度為3的int型陣列,並指定元素

fmt.printf("陣列型別為:%t", arr) // 陣列型別為:[4]int

2. 陣列長度自動計算,在定義的時候順序指定全部元素的初始化值;

var arr = [...]int

fmt.printf("陣列型別為:%t", arr) // 陣列型別為:[4]int

3. 通過索引來初始化陣列的元素,陣列的長度以最大的索引為準,沒有明確初始化的元素用0值初始化;

var arr = [...]int

var arr1 = [...]int

fmt.printf("陣列型別為:%t, %v", arr, arr) // 陣列 [0 2 0 3] 型別為:[4]int

fmt.printf("陣列型別為:%t, %v", arr1, arr1) // 陣列 [1 2 0 5 6] 型別為:[5]int

取值有兩種方式,一種是知道下標,通過索引直接取值:

var arr [4]int

fmt.printf("%v n", arr) // 陣列:[0,0,0,0]

fmt.printf("陣列第二個值為:%v", arr[1]) // 陣列第二個值為:0

另一種就是通過遍歷整個陣列來取值:

var arr [4]int

// 只獲取索引i

for i := range arr

// 同時獲取索引i 及對應的值v

for i, v := range arr

// 定義索引i 並讓其自增

for i := 0; i < len(arr); i++

for range方式進行迭代可以保證不會出現陣列越界的情形,這也就可以省去對下標越界的判斷

還有一種for range遍歷的應用,不取值,實現times次的快速迭代:

var times [5][0]int

for range times

times陣列雖然第一維陣列有長度,但是每個元素[0]int大小是0,因此整個陣列占用的記憶體大小依然是0。所以不需額外的記憶體代價,就可以實現times次快速迭代。

而陣列元素修改很簡單,直接通過索引指定要修改的元素,然後賦新值就可以了。

var arr [4]int

fmt.printf("%v n", arr) // 陣列:[0,0,0,0]

arr[2] = 10

fmt.printf("%v n", arr) // 陣列:[0 0 10 0]

總結一下:

go語言的陣列是一種值型別,雖然元素可以被修改,但是,陣列本身的賦值和函式傳參都是以整體複製的方式處理的;

為了避免複製陣列帶來的開銷,可以傳遞乙個指向陣列的指標。但是陣列指標並不是陣列,同時,指向不同長度陣列的陣列指標型別也是完全不同的;

陣列不僅僅可以用於數值型別,還可以定義字串陣列、結構體陣列、函式陣列、介面陣列、管道陣列等等。

go語言查詢某個值是否在陣列中 Go語言陣列詳解

陣列是乙個由固定長度的特定型別元素組成的序列,乙個陣列可以由零個或多個元素組成。因為陣列的長度是固定的,所以在go語言中很少直接使用陣列。和陣列對應的型別是 slice 切片 slice 是可以增長和收縮的動態序列,功能也更靈活,但是想要理解 slice 工作原理的話需要先理解陣列,所以本節主要為大...

快速修改陣列的問題

記得去年上演算法分析課的時候講過怎麼快速的修改陣列,比如,把陣列中偶數放在前面,奇數放在後面 把陣列中能被三除盡的數放在前面,不能的則放在後面。如果,我沒看到那道題我的思路肯定是乙個乙個的寫函式唄,不就是快速排序的思想嗎,不過,當我看到了那道題的解法後,發現,真的應該好好想想函式的通用性。下面,我直...

快速修改陣列的問題

記得去年上演算法分析課的時候講過怎麼快速的修改陣列,比如,把陣列中偶數放在前面,奇數放在後面 把陣列中能被三除盡的數放在前面,不能的則放在後面。如果,我沒看到那道題我的思路肯定是乙個乙個的寫函式唄,不就是快速排序的思想嗎,不過,當我看到了那道題的解法後,發現,真的應該好好想想函式的通用性。下面,我直...