Golang 基礎文法-進階資料類型(3)

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

Golang 基礎文法-進階資料類型(3)

本文主要介紹 golang 內建資料類型的 array, slice, map。這幾種資料類型在日常使用中是非常常見的。

array

定義文法如下:
var arr [n]type
其中 arr 是陣列變數的名稱(標識符), [n]type 表示這個數組是類型為 type 且長度為 n 的數組(type 可以是任何基本類型,也可以是任何自訂類型)
//執行個體示範var arr [10]int //定義一個長度為10的 int 類型的數組arr[0] = 42 //array 數組下標是從0開始的,給數組第一個元素賦值42arr[1] = 13//給數組第二個元素賦值13//列印數組第一個元素fmt.Printf("數組 arr 第一個元素是 %d\n", arr[0])//列印數組最後一個元素,arr[9]因為沒有初始化,輸出 int 類型的零值 0fmt.Printf("數組 arr 最後一個元素是 %d\n", arr[9])
定義數組的時候,可以把[n]type 看做一個完整的類型,舉個例子,[3]int 和 [4]int 可以認為是不同的資料類型,數組的長度也是不可修改的

當把一個 array類型的資料作為函數參數傳遞的時候,傳遞的是 array 的copy(拷貝值)而不是引用

/** * 數組是值傳遞而非引用傳遞 */func test(arr [4]int) int {    var sum int    for i, v := range arr {        sum = sum + v        arr[i] = sum    }    //列印結果是[1 3 7 12]    fmt.Printf("%+v\n", arr)    return sum}func main() {    arr := [4]int{1, 2, 4, 5}    //列印結果 12    fmt.Printf("%d\n", test(arr))    //列印結果[1 2 4 5],把 arr 傳遞給 test函數,且函數內修改了數組,沒有影響原數組,證明數組在函數參數中是傳遞 copy而不是引用    fmt.Printf("%v\n", arr)}
//捷徑定義數組arr := [3]int{1, 2, 3}//使用 ...替代長度讓編譯器自動計算數組的長度arr1 := [...]int{3, 5, 5}//二維數組darr :=[2][3]int{[3]int{1,2,3}, [3]int{33,33,33}}darr1 := [2][3]int{{2, 3, 4}, {1, 3, 4}}

slice(切片或者變長數組)

數組在一開始的時候,就要知道它的長度,然而很多時候我們並不能確定數組的大小,需要一種 "動態數組".在 golang 中 slice 為我們提供了這種可能。

slice 的定義和 array 非常相近,區別就是不用設定 n
文法 var slice[]int

說明:以上文法定義了一個 int 類型的 slice,

//執行個體說明//定義一個byte 類型的 slice,注意 byte 是uint8的別名,byte類型的 slice中,如果元素賦值為漢字超出 uint8的範圍就會報錯slice := []byte{'a', 'b', 'c'}
slice 可以從已經存在的數組(array)或者切片(slice)重新定義一個切片,文法格式為[i:j], i 是開始的索引,j 是結束的索引,但是最終的 slice 不包含 j 這個元素
//執行個體示範var ar = [10]byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}var a, b []byte//變數a 實際上的內容為 c,d,e 且 a 和 ar 共用底層資料a = ar[2:5]//變數 b 實際上的內容為 d,e 且 b 和 ar 共用底層資料b = ar[3:5]//思考如下結果是什嗎?ar[4] = 'x'fmt.Printf("%c\n", ar[4])//顯然是 xfmt.Printf("%c\n", a[2])//a[2]實際上指向的是 ar[4],結果是 xfmt.Printf("%c\n", b[1])//b[1]實際上指向的是 ar[4],結果是 x
ar[:n] 等價於 ar[0:n]
ar[n:] 等價於 ar[n:len(ar)]
ar[:] 等價於 ar[0:len(ar)]
//執行個體示範var arr = [10]byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}var aSlice, bSlie []byteaSlice = arr[:3] // a b caSlice = arr[5:] //f g h i jaSlice = arr[:] // a b c d e f g h i jaSlice = arr[3:7] // d e f g, 長度 len=4, 容量 cap=10-3bSlice = aSlice[1:3] // e f

slice 是參考型別,因此任何改變都會影響指向同一個 slice的其他 slice 或 數組。

slice 類似於結構體,包涵了下面三個部分

  • 一個指標:指向 slice 的起始地址
  • slice 的長度 int 類型
  • slice 的容量 int 類型

有一些內建函數可以操作 slice

  • len 擷取 slice的長度
  • cap 擷取 slice 的最大容量
  • append 追加一個或者多個 slice 到slice
  • copy 複製一個 slice 的所有元素到另外一個 slice,返回複製元素的個數

map

Map是一種索引值對資料結構,類似python 中的字典。定義文法如下:

map[keyType]valueType

slice 中索引只能是 int,在 map 中 key可以是 int string 等任何你想要的類型

執行個體示範如下

//使用 string 類型的 key,int類型的 value,可以使用 make 初始化var numbers map[string]int//定義並且使用 make 初始化numbers := make(map[string]int)//初始化後可以賦值numbers["one"] = 1numbers["two"] = 2numbers["three"] = 3//擷取 map 某個 key 的 valuefmt.Println(numbers["three"])

map 需要注意

  • map是無序的,每次列印顯示的結果可能都是不一樣的,只能使用 key 擷取 value
  • map 沒有固定的長度,它是一種引用型變數
  • len函數可以用於擷取 map 的長度,返回 map 有多少個 key
  • 通過 key改變 map 的 value 非常容易 只需要 使用類似m["k"] = 1的文法修改
//定義並且初始化 maprating := map[string]float32 {"C":5, "Go":4.5, "PHP":100}javaRating, ok := rating["Java"]if ok {    //do something}else{    //do something}//刪除 map 中的某個索引值對delete(rating, "C")m := make(map[string]string)m["hello"] = "world"m1 := mm1["hello"] = "girl" //m["hello"]的值也是 girl,因為底層指向資料一致

make 和 new 的區別

make 是 go 內建的一個方法,用於為 map,slice,channel 等內建類型分配記憶體,new可以為所有類型分配
new(T)給 T 分配零值記憶體,返回零值的記憶體位址,其實就是 *T,更詳細的說,就是返回一個指標,指標指向的是 T 的零值

new 返回指標

make 主要用於 slice map channel,返回初始化後的 T。原因在於 map slice channel底層的資料必須在初始化後才能指向他們。舉個例子,slice 包涵了一個指標,這個指標實際指向的是另外一個結構(包涵指標 長度 容量),在這些資料初始化之前 slice 是 nil,因此 slice,map,channel使用 make為他們底層的資料結構賦值合適的初始值

make 返回 非零值
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.