Go語言學習(二):array、slices和map

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

前言

近來個多月忙於論文,各方面原因的綜合,說多都是淚,等著結果了。關於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個變數:
  1. 一個指向原生數組的指標,即在底層仍舊開闢一個數組,數組切片結構中含有指向該數組的指標;
  2. 數組切片中的元素個數;
  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即可,非常簡單了。。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.