Go語言學習筆記 - 資料

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

數組

  數組和以往的認知有很大的不同。

  • 數組是實值型別,賦值和傳參會複製整個數組,而不是指標。
  • 數組長度必須是常量,且是類型的組成部分。[2]int和[3]int是不同類型。
  • 支援 "=="、"!="操作符,因為記憶體總是被初始化過的。
  • 指標數組[n]T,數組指標 [n]T
    可用複合陳述式初始化。支援多維陣列
    a := [3]int{1, 2}// 未初始化元素值為 0。b := [...]int{1, 2, 3, 4} // 通過初始化值確定數組⻓長度。c := [5]int{2: 100, 4:200} // 使用用索引號初始化元素。d := [...]struct {  name string  age  uint8}{  {"user1", 10}, // 可省略元素類型。  {"user2", 20}, // 別忘了最後一一行行的逗號。}  a := [2][3]int{{1, 2, 3}, {4, 5, 6}}b := [...][2]int{{1, 1}, {2, 2}, {3, 3}}// 第 2 緯度不能用用 "..."。

    值拷貝行為會造成效能問題,通常會建議使用 slice,或數組指標。

Slice

  需要說明,Slice並不是數組或數組指標。它通過內部指標和相關屬性引用數組片段,以實現變長方案。
runtime.h

struct Slice{// must not move anything    byte* array; // actual data    uintgo len; // number of elements    uintgo cap; // allocated number of elements};
  • 參考型別。但自身是結構體,值拷貝傳遞。
  • 屬性len表示可用元素數量,讀寫操作不能超過該限制。
  • 屬性cap表示最大擴張容量,不能超出數組限制。
  • 如果slice == nill,那麼len、cap結果都為0。
data := [...]int{0, 1, 2, 3, 4, 5, 6}slice := data[1:4:5]  //[low : heigh : max]

Slice


可直接建立 slice 對象,自動分配底層數組。

s1 := []int{0, 1, 2, 3, 8: 100}// 通過初始設定式構造,可使用用索引號。fmt.Println(s1, len(s1), cap(s1))s2 := make([]int, 6, 8)// 使用用 make 建立,指定 len 和 cap 值。fmt.Println(s2, len(s2), cap(s2))s3 := make([]int, 6)// 省略 cap,相當於 cap = len。fmt.Println(s3, len(s3), cap(s3))//輸出:[0 1 2 3 0 0 0 0 100] 9 9[0 0 0 0 0 0] 6 8[0 0 0 0 0 0] 6 6

  使用 make 動態建立 slice,避免了數組必須用常量做長度的麻煩。還可用用指標直接存取底層數組,退化成普通數組操作。

append操作

  向slice尾部添加資料,返回新的slice對象。

s := make([]int, 0, 5)fmt.Printf("%p\n", &s)s2 := append(s, 1)fmt.Printf("%p\n", &s2)fmt.Println(s, s2)//輸出:0x2102300000x210230040[] [1]

copy

  函數 copy 在兩個 slice 間複製資料,複製長度以 len 小的為準。兩個 slice 可指向同一底層數組,允許元素區間重疊。應及時將所需資料 copy 到較小的 slice,以便釋放超大號底層數組記憶體。

Map

  參考型別,雜湊表。鍵必須是支援相等運算子 (==、!=) 類型,比如 number、string、pointer、array、struct,以及對應的 interface。值可以是任意類型,沒有限制。

m := map[int]struct {    name string    age int}{    1: {"user01",10}    2: {"user02",20}}println(m[1].name)

  預先給 make 函數一個合理元素數量參數,有助於提升效能。因為事先申請一大塊記憶體,可避免後續操作時頻繁擴張。

m := make(map[string]int, 1024)

  Map常用操作:

m := map[string]int{    "a": 1,}if v, ok := m["a"]; ok {// 判斷 key 是否存在。    println(v)}println(m["c"]) // 對於不存在的 key,直接返回 \0,不會出錯。m["b"] = 2 // 新增或修改。delete(m, "c") // 刪除。如果 key 不存在,不會出錯。println(len(m)) // 擷取索引值對數量。cap 無無效。for k, v := range m { // 迭代,可僅返回 key。隨機順序返回,每次都不相同。    println(k, v)}

Struct

  實值型別,賦值和傳參會複製全部內容。可用 "_" 定義補位欄位,支援指向自身類型的指標成員。順序初始化必須包含全部欄位,否則會出錯。支援匿名結構,可用作結構成員或定義變數。支援 "=="、"!=" 相等操作符,可用作 map 鍵類型。可定義欄位標籤,用反射讀取。標籤是類型的組成部分。

type File struct {    name string    size int     attr struct {        perm int        owner int    }}f := File{    name: "test.txt",    size: 1025,    // attr: {0755, 1},// Error: missing type in composite literal}f.attr.owner = 1f.attr.perm = 0755var attr = struct {    perm  int    owner int}{2, 0755}f.attr = attr

  空結構 "節省" 記憶體,比如用來實現 set 資料結構,或者實現沒有 "狀態" 只有方法的 "靜態類"。

var null struct{}set := make(map[string]struct{})set["a"] = null

匿名欄位

  匿名欄位不過是一種文法糖,從根本上說,就是一個與成員類型同名 (不含包名) 的欄位。被匿名嵌入的可以是任何類型,當然也包括指標。

type User struct {    name string}type Manager struct {    User    title string}m := Manager {    User:User{"Tonny"},  //匿名欄位的顯式欄位名,和類型名相同。    title:"Administrator",}

  可以像普通欄位那樣訪問匿名欄位成員,編譯器從外向內逐級尋找所有層次的匿名欄位,直到發現目標或出錯。外層同名欄位會遮蔽嵌入欄位成員,相同層次的同名欄位也會讓編譯器無所適從。解決方案是使用顯式欄位名。不能同時嵌入一類型和其指標類型,因為它們名字相同。

物件導向

  物件導向三大特徵裡,Go 僅支援封裝,儘管匿名欄位的記憶體布局和行為類似繼承。沒有class 關鍵字,沒有繼承、多態等等。

type User struct {    id    int    name string}type Manager struct {    User    title string}m := Manager{User{1, "Tom"}, "Administrator"}// var u User = m  // Error: cannot use m (type Manager) as type User in assignment                  // 沒有繼承,自自然也不會有多態。var u User = m.User// 同類型拷⻉貝。

記憶體布局和 C struct 相同,沒有任何附加的 object 資訊。


memony info

聯繫我們

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