一.Array
在Go語言中,數組是一個值類型(value type)
所有的值類型變量在賦值和作為參數傳遞時都將產生一個復制動作
如果作為函數的參數類型,則在函數調用時參數發生數據復制,在函數體中無法修改傳入數組的內容
數組相等用 = != 比較,不能用 < >
1.聲明&賦值
初始化
語法
e.g.
var a [5]int //[0 0 0 0 0]
var c [2][3]int //二維
var b int = [5]int{1,2,3,4,5} //聲明并初始化
a := [3]int{1,2,3}
b := [10]int{1,2,3} //前三個元素,其他為0
c := [20]int{19:1} //第20個元素初始化為1,其他默認0
d := [...]int{4,5,6} //自動計算長度
e := [...]int{0:1, 1:2, 19:3} //自動推斷
二維數組
arrLength := len(arr)
注意,數組長度也是類型的一部分,因此不同長度數組為不同類型(內置常量)
即[3]int和[4]int是不同類型,并且數組不能改變長度
數組之間的賦值是值的賦值,即當把一個數組作為參數傳入函數的時候,傳入的其實是該數組的副本(一次復制操作),而不是它的指針,如果要傳入指針,使用slice
2.元素訪問
for i, v := range array {
fmt.Println(i, v)
}
指向數組的指針
二.Slice
數組切片就像一個指向數組的指針,但更復雜,實際上它擁有自己的數據結構,而不僅僅是指針(指向原生數組的指針 + 數組切片中元素個數 + 數組切片已分配的存儲空間)
一個引用類型,總是指向一個底層array,聲明可以向array一樣,只是不需要長度
slice就像一個結構體,包含三個元素
一個指針,指向數組中slice指定的開始位置
長度,即slice的長度
最大長度,也就是slice開始位置到數組的最后位置的長度
1.聲明&賦值
通過array創建
a := [5]int{1,2,3,4,5}
b := a[2:4]
b := a[:4]
b := a[2:]
var a, b []byte
a = ar[2:5]
b = ar[3:5]
2.元素訪問
for i, v := range mySlice {
fmt.Println(i, v)
}
3.其他操作
大小和容量
len獲取slice的長度
cap獲取slice的最大容量
動態增減元素
//append
mySlice = append(mySlice, 1, 2, 3) //增加三個元素
mySlice = append(mySlice, mySlice2) //增加另一個
注意,append會改變slice所引用的數組的內容,從而影響到引用統一數組的其他slice,
但當slice中沒有剩余空間,此時動態分配新的數組空間返回的slice數組指針將指向這個空間,
而原數組的內容將保持不變,其他引用此數組的slice不受影響(坑,可能引入bug)
內容復制
slice1 := []int{1,2,3,4,5}
slice2 := []int{5,4,3}
copy(slice2, slice1) //復制slice1前三個 1 -> 2
copy(slice1, slice2) //復制slice2的前三個 2 -> 1
切片
三.Map
Python中字典的概念
map是無序的,長度不固定,內置的len可以用于map,可以方便的修改
1.聲明&賦值
var m map[string] PersonInfo
m = make(map[string] personInfo[, 100])
var numbers map[string]int
or
numbers := make(map[string]int)
numbers["one"] = 1
2.元素訪問
csharpRating, ok := rating["C#"]
if ok {
fmt.Println("get the value")
} else{
fmt.Println("error")
}
賦值
四.其他
make和new操作
new用于各種類型的內存分配
new本質上和其他語言中同名函數一樣, new(T)分配了零值填充的T類型的內存空間,并返回其地址,即一個*T類型的值 即,返回一個指針,指向新分配的類型T的零值
make(T, args),只能創建slice,map,channel,并返回一個有初始值(非零值)的T類型,而不是*T。 本質來講,導致這三個類型有所不同的原因是,指向數據結構的引用在使用前必須被初始化
新聞熱點
疑難解答