每種語言在實現資料結構有些許不同。go 是如何實現的呢?
1. 陣列 array
package main
import "fmt"
func main()
x[3] = 4 // [1 2 0 4 0 0 0]
// x[8] = 8 越界無法通過編譯
a := [3]int
b := [...]int // 型別推導
// x 和 a,b 是兩種不同的資料型別
// 編譯器會把 b陣列 翻譯成 a 這種型別。
fmt.printf("%t\n", x)
fmt.printf("%t\n", a)
fmt.printf("%t\n", b)
fmt.println(x)
fmt.println(a)
fmt.println(b)
}e:>go run main.go
[7]int
[3]int
[3]int
[1 2 0 4 0 0 0]
[1 2 3]
[1 2 3]
由於 陣列長度固定, 無法直接擴容追加元素,所以在寫 go **時,陣列用的並不多。
通常有三種方式獲取乙個切片:
從乙個陣列
使用字面量初始化切片
make 關鍵字建立切片
也可以從乙個切片獲取切片(切片再切片)
package main
import "fmt"
func main ()
fmt.printf("array type is :%t; value is %s\n",array,array)
// 1. 從陣列獲取乙個切片
s1 := array[0:3]
fmt.printf("s1 type is :%t; value is %s\n",s1,s1)
s11 := s1[0:2] // 切片再切片
fmt.printf("s11 type is :%t; value is %s\n",s11,s11)
s1[0] = "aa" // 切片再切片時,底層切片修改的元素的值, 新切片的值也會隨著改變
s11[1] = "bb" // 切片再切片時,新切片修改的元素的值, 底層切片的值也會隨著改變
fmt.printf("### s1 type is :%t; value is %s\n",s1,s1)
fmt.printf("### s11 type is :%t; value is %s\n",s11,s11)
// 2. 從字面量初始化
s2 := string
fmt.printf("s2 type is :%t; value is %s\n",s2,s2)
s22 := s2[0:2]
fmt.printf("s22 type is :%t; value is %s\n",s22,s22)
s2[0] = "xx" // 切片再切片時,底層切片修改的元素的值, 新切片的值也會隨著改變
fmt.printf("### s2 type is :%t; value is %s\n",s2,s2)
fmt.printf("### s22 type is :%t; value is %s\n",s22,s22)
// 3. make 函式初始化
s3 := make(int,5,10)
s3[1] = 2
fmt.printf("s3 type is :%t; value is %d\n",s3,s3)
}e:>go run slice.go
array type is :[5]string; value is [a b c d e]
s1 type is :string; value is [a b c]
s11 type is :string; value is [a b]
### s1 type is :string; value is [aa bb c]
### s11 type is :string; value is [aa bb]
s2 type is :string; value is [x y z n]
s22 type is :string; value is [x y]
### s2 type is :string; value is [xx y z n]
### s22 type is :string; value is [xx y]
s3 type is :int; value is [0 2 0 0 0]
切片擴容:
s5 := int
//s6 := make(int,10,10)
s6 := int
copy(s6,s5)
fmt.println(s5,s6) // [1 3 5] [1 3 5 8 10]
複製整個大切片,消耗記憶體較多,應該避免此類操作影響程式的效能。
雜湊表是go語言中另一種集合型別,陣列用於標識元素的序列,而雜湊表表示的是鍵值對之間的對映關係。
雜湊函式和解決雜湊衝突是實現乙個效能優異的雜湊表的關鍵:理想的情況下,雜湊函式應該能將不同的鍵對映到不同的索引上,這就要求雜湊函式的輸出範圍要大於輸入範圍,但是由於
鍵的數量會遠遠大於對映的範圍,所以在實際使用時這個效果不可能實現。比較實際的方式是讓雜湊函式的結果盡可能的均勻分布,然後通過工程手段解決雜湊衝突的問題。不均勻的雜湊
的雜湊函式讀寫效能可能會達到 o(n)。在完美的雜湊函式,當鍵的數量足夠多是也會產生衝突。開放定址法和拉鍊法是解決雜湊衝突常用的兩種方式。大多數程式語言和資料庫通常會選擇
拉鍊發解決衝突,開放定址法解決衝突底層用的依然陣列,而拉鍊法用 陣列+鍊錶 實現了乙個 雜湊桶,相當於乙個二位陣列,衝突時放到桶裡,而查詢時只需要遍歷這個鍊錶(桶),但
通常鍊錶的長度控制在4以內,否則效能不太高。
有兩種方式得到乙個 map:
package main
import (
"fmt"
)func main()
// make 函式生成 map
m2 := make(map[int]string)
m2[1] = "a"
m2[2] = "b"
m2[3] = "c"
fmt.printf("%#v\n",m1)
"%#v\n",m2)
// 遍歷 map
for i:=1;i<=len(m2);i++
fmt.println(i,m2[i])
} // 刪除 元素
delete(m1,1)
fmt.printf("%#v\n",m1)
// v,ok 判斷 key 是否存在
v,ok := m1[1]
if !ok else
}
package main
import "fmt"
func main()
golang資料結構
常見的資料結構有陣列 切片 map 結構體。陣列是乙個由固定長度的特定型別元素組成的序列,乙個陣列可以由零個或多個元素組成。陣列的宣告語法如下 var variable name size variable type陣列變數名 陣列宣告及使用時的變數名。元素數量 陣列的元素數量,可以是乙個表示式,但...
golang基礎資料結構
這裡主要討論四種型別 陣列 slice map和結構體 陣列和結構體是聚合型別 它們的值都是由很多個元素或者成員欄位的值組成。陣列是有同構元素組成 每個陣列的元素的型別相同 結構體為異構元素組成 每個結構體不一定是同型別元素構成 陣列和結構體都是有固定記憶體大小的資料結構 slice和map則是動態...
Golang 資料結構 字典
字典儲存 key,value 對,go提供了非常方便的實現,內建的map型別。本文增強內建的map型別,新增便捷的操作用於獲取或改變其內容。建立itemdictionary泛型 併發安全的,能夠生成任何具體型別。通過dict valuedictionary 建立字典,提供一組暴露方法 測試 描述如何...