Go語言中的 Array, Slice和 Map

2021-06-29 07:37:26 字數 4934 閱讀 3520

曾經學習python的時候,記得書上說 dict 是python的 horsepower(動力)。然後,slice 和 map 又何嘗不是golang的 workhorse 呢?

陣列的宣告(這裡就是定義,給資料儲存分配了空間):

var arrayname [arraysize] datatype

如果陣列定義好之後, 沒有給陣列元素指定值,那麼所有元素被自動初始化為零值。

陣列的初始化

var a = [10]int  //定義陣列的時候,直接初始化

var b = [10]int //部分元素初始化, 其餘元素零值

var c = [...]int //由初始化列表決定陣列長度,不可省去識別符號 "...",否則將變成切片slice

var d = [10] //可以按照下標來進行初始化

陣列的訪問,可以直接按照下標進行訪問

陣列的遍歷:

package main

import(

"fmt"

)func main()

for i :=2; i <20; i++

for i :=0; i <20; i++

fmt.printf("f[%2d] = %4d",i , f[i])

}}

也可以採用 range 關鍵字進行遍歷:

func main() 

fori := 2; i

< 20; i++

fori , v := range f

}

多維陣列

var a [3][4]int

初始化

var a = [3][4]int , , }

多維陣列遍歷

/*找到二維陣列中的最大元素*/

package main

import "fmt"

func main() , , }

max = a[0][0]

for i := 0; i < = 2; i ++ }}

fmt.println("max = %d, row = %d, col = %d\n", max, row, col)

}

`var s1 int`
三種建立方式: 基於底層陣列建立,直接建立,或者 make() 函式建立

基於底層陣列建立 slice

var slice1 int   //宣告但是不分配空間

slice1 = array[start:end] //這裡不包含 end

slice2 := array[:] // 引用全部的元素

slice3 := array[0:len(array)]

var slice4 int

sliec34 = array

//引用全部的元素

直接建立 slice

在宣告的時候,直接初始化。

var slice1 = int
make()函式建立 slice
var slice1 = make(int,5)  //長度和容量都是 5

var slice2 = make(int,5,10) //容量是5.

採用下標進行訪問,採用 range 進行遍歷。

packge main

import

"fmt"

func main()

//使用下標訪問 slice

for i :=0; i <=4; i++

fmt.println()

//使用range 進行遍歷

for i, v := range slice

}

slice 中的切片的元素,可以動態的新增和刪除,所以操作起來要比陣列更加方便。

切片元素的增加

package main

import

"fmt"

func main()

程式輸出是:

len =3

cap =6

[100

0]len =6

cap =6

[10001

23] // 這裡的[1, 2, 3] 沒有被 [4, 5, 6]覆蓋

len =7

cap =12[00

0456

7] //這裡第乙個元素沒有變成10,並且容量變成原來的2倍。

切片元素的複製

使用切片長時間引用超大的底層陣列,會導致嚴重的記憶體浪費現象。 可以新建乙個小的slice 物件,然後將所需要的資料複製過去,這樣子就不會引用底層陣列,直接拷貝了資料,這就是需求。函式 copy()可以 在切片之間複製元素。

package main

import

"fmt"

func main()

var slice2 = make(int,3,5)

var n int

n = copy(slice2, slice1) // just copy three elements

fmt.println(n, slice2, len(slice2), cap(slice2))

slice3 := slice1[3

:6] //二者引用同乙個底層陣列

n = copy(slice3, slice1[1

:5]) //所以,copy的時候發生元素重疊

fmt.println(n, slice1, slice3)

}程式輸出為:3[12

3]353[1

2323

4789

10] [2

34] //可以看到元素重疊

map 儲存的是 鍵值對(key-value)。是乙個無序的資料的集合,通過鍵來進行索引得到對應的值。 這種方式可以加快查詢速度。map 通常稱為 字典(dictionary) 或者雜湊表(hash table)。map 現在是很多語言的標配。

字典名稱,「鍵」型別, 「值」型別

var mapname map[keytype]valuetype

注意:不需要給字典指定長度,字典的長度會在初始化或者建立的過程中動態增長

key 必須是能支援比較運算子(==, !=)的資料型別,比如 整數,浮點數,指標陣列結構體介面等。 而不能函式,字典,切片這些型別。

value 型別 可以是go語言的任何基本資料型別。

var map1 map[string]int字典 宣告好之後,必須經過初始化或者建立 才能使用。未初始化或者建立的字典為 nil

可以使用「{}」來在宣告的時候進行初始化。

可是使用make()來建立字典。

建立或者初始化之後,就可以使用「=」操作符來動態的向字典中新增資料項了。

下面使用方式錯誤,編譯不通過:

var map1 map[string]int

map1["key1"] =2

//編譯不通過,字典沒有初始化或者建立

下面使用方式正確

var map1 map[string]int {}  //字典的初始化

map1["key1"] =1

var map2 map[string]int

map2 = make(map[string]int) //字典的建立

map2["key2"] =2

//使用 等號 新增資料項

v, ok :=mapname[key]    //注意這裡是 :=
如果key存在,將key對應的value賦值給v,ok== true. 否則 v 是0,ok==false.

package main

import

"fmt"

func main()

//v, ok := map1["key1"]

if ok else

// 這裡 不是 :=,是 = ,因為這些變數已經定義過了。

v, ok = map1["key3"]

if ok else

}輸出為:100

true

0

go 提供了內建函式delete()來刪除容器內的元素。

delete

(map1, "key1")

如果key1值不存在,那麼呼叫將什麼也不發生,也不會產生***。 但是,如果傳入的map 是乙個 nil,那麼將導致程式出現異常,這一點在寫程式的時候特別注意。

package main

import (

"fmt"

)func main()

for k, v := range map1

if k == "key3"

}fmt.println(map1)

}程式輸出:

key2200

key3300

key1100

map[key1:100 key4:400 key3:300] //可以看到 map 是無序的。

go 語言中的繼承

go 語言中可以通過匿名field來實現繼承的效果,type t1 struct func t t1 log func t t1 print type t2 struct t2 t2 可以通過t2.log 直接訪問t1的method,就像物件導向的繼承之後一樣訪問,不過這裡要注意的傳遞到log的是t...

Go語言中的常量

常量,一經定義不可更改的量。功能角度看,當出現不需要被更改的資料時,應該使用常量進行儲存,例如圓周率。從語法的角度看,使用常量可以保證資料,在整個執行期間內,不會被更改。例如當預處理器的架構型別,可以保證不被更改。語法如下 const 常量名 可選的型別 常量值 const c1 int 1000g...

go語言中的map

package main import fmt sort func main 同上 var b map int string make map int string 通過make建立map var c make map int string 簡化寫法 d make map int string 設定...