Monday, December 27, 2021

[用Golang寫小遊戲教學] 第四章 陣列(Array)與切片(Slice)

[前言]

陣列(Array)就好比是單排座位的列車,座位編號從0開始,共有N個座位且不可增加座位數量。
切片(Slice)很像陣列(Array),但它是可以增加座位數量。 Slice細節還有關於容量與長度的問題,我們就先忽略它~
所以,這兩種資料結構可以存放一長串的資料,這是在寫小遊戲中非常常使用到的功能。


[陣列(Array)]

陣列(Array):它的長度是固定的(fixed length),使用語法: " [數量] 型別" 定義。例如: [100]int

它比較沒有彈性,內部存放的資料都必須要有相同的型別(像是整數、字串等等)。

已經學習過變數宣告,我們舉兩個例子(變數宣告與變數短宣告)來宣告變數型別為陣列:

// 變數宣告
var myArr [2]string
a[0] = "Hi"
a[1] = "There"

// 變數短宣告
myArr2 := [2]int{100, 50}

 

[切片(Slice)]

Slice:可以增加或減少Slice內資料的數量,使用 [] 定義,例如,[]int 是 int slice,指元素為 int 的 slice;[]string 是 string slice,指資料為 string 的 slice。建立Slice有下列幾種方式:

方式1:建立一個帶有某種型別的 slice,用在知道 slice 裡面的元素有哪些時,例如字串slice
 names := []string{"Tom", "John"}


方式2:透過 make 可以建立空 slice,適合用會對 slice 中特定位置元素進行操作時
people := make([]int, 5)   
說明: 不指定capacity會與length相同。
len=5 cap=5,[0,0,0,0,0]


方式3:大該知道需要多少元素時使用,同時給定length 與 capacity,搭配 append 使用
people := make([]string, 0, 5, 10)   
說明:  這邊先暫時不多解釋capacity的意義。
len=5 cap=10, [
0,0,0,0,0]


[練習時間]

我們來練習剛剛教過的例子:

names := []string{"Tom", "John"}
fmt.Println("names:", names, "長度:", len(names), "容量:", cap(names))
score1 := make([]int, 5) // len=4 cap=4,[0,0,0,0,0]
fmt.Println("score1:", score1, "長度:", len(score1), "容量:", cap(score1))
var names2 []string
names2 = names
names2[0] = "Danny"
fmt.Println("names2:", names2, "長度:", len(names2), "容量:", cap(names2))
score2 := make([]int, 5, 10) // len=5 cap=10, [0,0,0,0,0]
score2[3] = 100
fmt.Println("score2:", score2, "長度:", len(score2), "容量:", cap(score2))

 結果:

names: [Tom John] 長度: 2 容量: 2
score1: [0 0 0 0 0] 長度: 5 容量: 5
names2: [Danny John] 長度: 2 容量: 2
score2: [0 0 0 100 0] 長度: 5 容量: 10




No comments: