iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
Software Development

什麼都不會還敢說你是 RD 啊?畢業後的後端入職前準備系列 第 21

【Day 21】Go 基礎小筆記 II(pointer / array / slice / map / struct)

  • 分享至 

  • xImage
  •  

筆記會紀錄與已知的 Python 的差別,
或是對我來說比較需要記憶的部分。
初學 Go 不建議看這幾篇文章。

2021/10/15 更新:因為寫 merge sort 對 slice 的理解提升了一些,稍微對 array 和 slice 增加一些東西。

pointer

  • 指標部分看起來跟 C 差不多?
  • nil

array

  • 長度固定
  • 宣告 arr := [5]string{"a", "b", ...略}
  • ...:後面有初始化,可以省略長度不用自己算有幾個~真聰明
    i.e. arr := [...]string{"Iron Man", "Dr.Stange", "Thor"}
  • 跟 Python 一樣的 len
  • range:Python equivalence 為 enumerate
for i, v := range 陣列 {
    fmt.Println(i, v)
}

slice

這篇很詳細且有圖片[Golang] Slice and Array

  • 長度可增減
  • 可以直接宣告,也可以從 array 取出。
  • 直接宣告的樣子就像是沒有限制長度的 array ([]int 是 int slice)
  • slice 感覺像是紀錄 array 頭尾的 reference,取出陣列的一部份並更動時會動到原資料。
    Python 中的 slice 比起來就比較像是複製一部分的 list 出來,更動時不會動到原來的資料。
arr := [5]string{"dog", "dog", "dog", "dog", "dog"}
slice := arr[1:4]
slice[0] = "cat"
// 這時 arr[1] 變為 cat 
  • cap() 表示此 slice 開頭到 原來陣列的結尾 的長度
  • 不像 Python list 切超過還是會回傳值,Go 會噴錯
    i.e. arr 有 5 個元素
arr[1:100] # python 會回 arr[1:5]
arr[1:100] // go:out of bounds for 5-element array)
  • make 動態產生 slice
// len, cap = 2
slice1 := make([]string, 2) 
// len 2 cap 5
slice2 := make([]string, 2, 5)

  • append
    slice = append(slice, "new string")
    若 cap 不足會動態增加,cap *= 2

map

  • Python 的 dictionary
  • 宣告
// 至少要說好 key 的型別
var m1 map[string]
// key 為 string,value 為 int 
var m2 = map[string]int {"aaa": 30, "bbb": 45}
  • value 有「預設值」,沒這個 key 也會有那個型別的預設值回傳而不是 key error
    以上面的 m2 做例子
fmt.Println(m2["ccc"]) // 印出 0
  • 檢查 key 是否存在,用第二個回傳值
v, keyExist = m2["ccc"]
  • 遍歷 map(跟 Python 一樣不保證順序)
for k, v := range m2 {
    fmt.Println(k, v)
}
  • delete 刪除不存在的也不會噴錯
    delete(m2, "bbb")

上一篇
【Day 20】Go 基礎語法
下一篇
【Day 22】Go 基礎小筆記 III :method / interface
系列文
什麼都不會還敢說你是 RD 啊?畢業後的後端入職前準備31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言