這裡主要討論四種型別———陣列、slice、map和結構體
陣列和結構體是聚合型別;它們的值都是由很多個元素或者成員欄位的值組成。陣列是有同構元素組成——每個陣列的元素的型別相同;結構體為異構元素組成——每個結構體不一定是同型別元素構成;陣列和結構體都是有固定記憶體大小的資料結構;
slice和map則是動態的資料結構,它們需要動態增長;
需要注意的是函式中傳遞陣列:一般而言,當呼叫函式時,函式的每個呼叫引數將會被賦值給函式內部的形式引數,所以函式引數接收的是乙個複製的副本,而不是原始呼叫的變數。因此函式引數傳遞的機制導致了傳遞大陣列將十分低效,並且對陣列引數的任何修改都將發生在複製的陣列上,而並不能直接修改呼叫時原始的陣列變數。與其他語言的做法(隱式地作為引用或者指標物件傳入)不同,golang可以顯示傳入乙個陣列指標:
1 func zero(ptr *[3]int)5fmt.println(ptr)6}
7 myarray := [...]int
8for _, v :=range myarray
11 zero(&myarray) // 注意 &
即便如此,陣列依然很少用作函式引數,我們一般使用slice來替代陣列;
slice(切片)代表變長的序列,序列的元素是同型別的;slice是輕量級的資料結構,提供了訪問陣列子串行(或者全部)元素的功能;
slice由三部分構成:指標、長度、容量
1func reverse(s int)
5}
67 myarray := [...]int
8for _, v :=range myarray
11 //zero(&myarray)
12 reverse(myarray[:]) //傳slice
warning:slice之間不能進行比較,因此不用用==來判斷兩個slice是否含有相同的元素,如果需要比較slice則需要通過標準庫提供的高度優化的bytes.equel來判別兩個slice是否相同(byte), 但是對於其他型別的slice, 必須展開每個元素進行比較:
func equal(x, y string) boolfor i :=range x
}return
true
}
唯一合法的slice比較操作是和nil比較:
if summer == nil
1 ages :=make(map[string]int)2 或ages :=map[string]int
map中的元素並不是乙個變數,因此不能對map的元素進行取址操作:
_ = &ages["bob"] //compile error: cannot take address of map element
禁止對map元素取址的原因是map可能隨著元素數量增長而重新分配更大的記憶體空間,從而可能對之前的位址失效;
map遍歷:map的迭代順序是不確定的,並且不通的雜湊函式實現可能導致不同的遍歷順序,在實踐中,遍歷的順序是隨機的,每一次遍歷的順序都不同的,這是故意的,每次都是使用隨機的遍歷順序可以強制要求程式不會依賴具體的雜湊函式實現,如果要按順序遍歷key/value對,必須顯示對key進行排序,可以使用sort包對strings函式對字串slice進行排序。
Golang基礎 資料結構 陣列(array)
var 變數名 元素數量 長度 元素型別 例如 var a 5 intvar b 4 int注意 1.陣列是多個相同型別資料的組合,乙個組合一旦宣告或定義,其長度是固定的,不能動態變化 2.陣列中的元素可以是任何資料型別,包括值型別和引用型別,但是不可以混用 3.建立後,如果沒有賦值,預設零值 4....
golang資料結構
常見的資料結構有陣列 切片 map 結構體。陣列是乙個由固定長度的特定型別元素組成的序列,乙個陣列可以由零個或多個元素組成。陣列的宣告語法如下 var variable name size variable type陣列變數名 陣列宣告及使用時的變數名。元素數量 陣列的元素數量,可以是乙個表示式,但...
Golang 資料結構
每種語言在實現資料結構有些許不同。go 是如何實現的呢?1.陣列 arraypackage 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 是兩種不同的資料型別 編譯器會把...