這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前言
近來個多月忙於論文,各方面原因的綜合,說多都是淚,等著結果了。關於Go語言的學習,本文的內容老早就學習了,之前時間也不知去哪了,而且也沒心思,現在謄寫上來吧。
數組array
定義形式: [
n],n標示array長度,標示類型。
// e.g:[32]byte // 長度32的數組,每個元素為1個byte[16]*float64 // 指標數組[3][5]int // 二維數組
在Go語言中,數組長度在定義後不可更改。擷取array元素個數方法:arrLength := len(array)
元素訪問與C一致。需要注意的一點,Go語言中數組屬於
實值型別,不能像C一樣用於指標傳遞。也就是說,如果數組作為函數入參,則在調用該函數時,函數將對數組做一份拷貝副本,函數修改的是副本上的內容。
// e.gpackage mainimport "fmt"func modify(array [5]int) {array[0] = 10fmt.Println("In modify(), array values:", array[0])}func main() {array := [5]int{1, 2, 3, 4, 5}modify(array)fmt.Println("In main(), array values:", array[0])}
數組切片slices
數組特點:長度在定義後無法再修改;實值型別;
如果需要將數組作為函數入參,用於指標傳遞方式,這種情況下,Go語言就使用數組切片來滿足該需求。因此,數組切片屬於
參考型別。
數組切片擁有自己的資料結構,可以抽象為以下3個變數:
- 一個指向原生數組的指標,即在底層仍舊開闢一個數組,數組切片結構中含有指向該數組的指標;
- 數組切片中的元素個數;
- 數組切片已指派的儲存空間;
數組切片建立
// e.gvar myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}var mySlice []int = myArray[:5] // Go語言支援用myArray[first:last]格式選擇數組元素
利用內建函數make()靈活建立,或者直接初始化建立。
// e.gmySlice1 := make([]int, 5) // 建立元素個數為5的數組切片,預設初始化為0mySlice2 := make([]int, 5, 10) // 同上,但總共預留的是10個元素的儲存空間mySlice3 := []int{1, 2, 3, 4, 5} // 直接建立並初始化包含5個元素的數組切片
// e.goldSlice := []int{1, 2, 3, 4, 5}newSlice := oldSlice[:3] // 基於oldSlice的前3個元素構建新數組切片
類似於數組切片基於數組建立,與基於數組建立區別就是:基於舊有切片建立的新數組切面可以超過所包含的元素個數,超出元素部分初始化為0,但有一個限制就是不得超過舊有切片的儲存空間。
動態增減元素
數組切片有一個儲存能力的概念,即元素個數和分配空間可以是兩個不同的值。為了大幅降低數組切片內部重新分配記憶體和搬送記憶體塊頻率,提供者效能,需要我們合理設定儲存能力的值。
數組切片支援Go語言內建的cap()和len()函數,cap()返回數組切片分配空間值,len()返回切片中儲存的元素個數。
如果需要往mySlice已包含的元素後面繼續新增元素,則使用append()內建函數。
// e.gmySlice = append(mySlice, 1, 2, 3) // 添加普通元素mySlice = append(mySlice, mySlice1...) // 添加一個切片,注意後面“...”一定不能省略
數組切片會自動處理儲存空間不足的問題。如果追加的內容長度超過當前已指派的儲存空間,數組切片會自動分配一塊足夠大的記憶體。這也是之前說到要合理設定儲存空間值的原因。
另外切片支援Go語言的內建函數copy(),用於將內容從一個切片複製給另一個切面。如果加入的兩個切片不一樣大,則按其中較小的那個切片的元素個數進行複製。
// e.g slice1 := []int{1, 2, 3, 4, 5}slice2 := []int{5, 4, 3}copy(slice2, slice1) // 複製slice1的前三個元素到slice2中copy(slice1, slice2) // 複製slice2的3個元素到slice2的前3個位置
索引值對map
map是一堆索引值對的未排序集合。
// e.gvar myMap map[string] PersonInfo
其中,myMap是聲明的map變數名,string是?類型,PersonInfo則是其存放的實值型別。
依舊使用內建函數make()來建立一個map。
// e.gmyMap = make(map[string] PersonInfo, 100)
或者直接建立並初始化map的代碼如下:
// e.gmyMap = map[string] PersonInfo {"1234": PersonInfo{"1", "Jack", "Room 101, ..."}}
// e.gmyMap["456"] = PersonInfo{"2", "Bob", "Room 102, ..."}
使用內建函數delete(),用於刪除容器內的元素。
使用以下代碼就可實現尋找:
// e.gvalue, ok := myMap["1234"]if ok {// 找到了, 處理...}
這幾行代碼錶示只需查看第二個傳回值ok即可,非常簡單了。。