曾經學習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()
函式建立 slicevar 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 設定...