iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
自我挑戰組

30 天學 Golang?Go 啦哪次不 Go系列 第 8

Day8# Array & Slice(下)

昨天沒有寫完的 Array & Slice(上) ,今天要來把補完進度。
那我們就開始吧 ─=≡Σ(((っ゚∀゚)っ

Slice Again

稍微快速回憶一下 slice 的特性:

  • 可以任意增加陣列內的元素及長度
  • 與 array 同樣以 [] 定義,但不同的是不用在 [] 內寫上數量

兩種定義方法:

// 方法1
cats := []string{"BuiBui", "MeiMei"}

// 方法2
func make([]string, len, cap) 

咦,方法2的 lencap 又代表什麼呢?
slice 裡面包含了三樣東西

  1. pointer to the array:會指向底層的 array (沒錯,就是 array)
  2. length:slice 中的元素數目
  3. capacity: 底層 array 的長度

以下資訊舉例,當 len 元素有幾個就會長出幾個 0 (因為 []T = []int,如果是 string 就會是 )。

// len = 3, cap = 3
gopher := make([]int, 3) // => [0, 0, 0]

// len = 0, cap = 5
gopher := make([]int, 0, 5) // => []

需要特別注意的是,len 的長度不能夠超過 cap,不然會出現錯誤。

// 醬是不行的
gopher := make([]int, 5, 0) // => error!

所以當我們在使用 slice 時,其實是透過 slice 指向某個記憶體位置內的 array。

append

如果想要新增 slice 的元素,就需要使用 append 這個方法:

cats := []string{"BuiBui", "MeiMei"}
cats = append(cats, "Peko")

次元切割刀

登愣!次元切割刀!
拿摸厲害,尼塊縮縮看怎麼用R~

既然 slice 叫做 slice,那麼他應該就能夠做切割!

num := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
num = num[1:3]
fmt.Println(num, len(num), cap(num)) // => [2, 3] len = 2, cap = 8

num := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
num = num[:3]
fmt.Println(num, len(num), cap(num)) // => [1, 2, 3], len = 3, cap = 9

num := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
num = num[3:]
fmt.Println(num, len(num), cap(num)) // => [4, 5, 6, 7, 8, 9], len = 6 , cap = 6

結尾

slice 的介紹到這結束了,如果有任何問題歡迎與我告知 :)


上一篇
Day7# Array & Slice(上)
下一篇
Day9# Function 及 Function Receiver
系列文
30 天學 Golang?Go 啦哪次不 Go20

尚未有邦友留言

立即登入留言