我們在前一天介紹了 Go 的 for 迴圈
今天要來介紹的是 Go 的 Array、Slices,兩者非常類似
Array | Slices | |
---|---|---|
長度 | 固定長度 | 彈性長度 |
從上面的表格來看,
Array 代表的是一個固定長度的陣列
Slices 代表的是一個彈性長度的陣列
在 Go 要宣告一個固定長度的陣列很簡單,語法如下
// 陣列初始化
var ary [10]int
ary[0] = 1
ary[1] = 3
ary[2] = 5
// 自帶陣列內容
var ary [10]int = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
或是
// 陣列初始化
ary := [10]int{}
ary[0] = 1
ary[1] = 3
ary[2] = 5
// 自帶陣列內容
ary := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
如果宣告一個空陣列,陣列內元素的預設值會是該陣列元素型別的預設值
以 [10]int
長度為 10 的整數陣列來說,預設值就會是 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
在 Go 要宣告一個彈性長度的陣列很簡單,語法如下
slices := []int{}
如果要添加元素進去的話,可以透過 append
來添加
slices = append(slices, 1, 3, 5, 7)
如果是要取得 Array 中一個區段的資料,可以用下面這個方式來取得
ary := [10]int{1, 3, 5, 7, 9, 11}
slices := ary[1:3]
而 Slices 還有一個特性,就是 Array 的 Reference,這樣講可以看不太懂,直接上範例
package main
import "fmt"
func main() {
macs := [6]string{
"MacBook Air",
"MacBook Pro",
"Mac mini",
"iMac",
"Mac Studio",
"Mac Pro",
}
fmt.Println(macs)
a := macs[0:2]
b := macs[1:3]
fmt.Println(a, b)
b[0] = "XXX"
fmt.Println(a, b)
fmt.Println(macs)
}
/* 實際輸出結果
[MacBook Air, MacBook Pro, Mac mini, iMac, Mac Studio, Mac Pro]
[MacBook Air, MacBook Pro] [MacBook Pro, Mac mini]
[MacBook Air, XXX] [XXX, Mac mini]
[MacBook Air, XXX, Mac mini, iMac, Mac Studio, Mac Pro]
*/
從上面的範例可以看出,當 b[0]
的值改成 "XXX"
後,也會連動改到原本的 macs
,但為什麼呢?
我們來把記憶體位址 print 出來看一下
package main
import "fmt"
func main() {
macs := [6]string{
"MacBook Air",
"MacBook Pro",
"Mac mini",
"iMac",
"Mac Studio",
"Mac Pro",
}
fmt.Println(macs)
fmt.Printf("memory address of macs:%p\n\n", &macs)
a := macs[0:2]
b := macs[1:3]
fmt.Println(a, b)
fmt.Printf("memory address of a:%p,b:%p\n\n", &a, &b)
b[0] = "XXX"
fmt.Println(a, b)
fmt.Printf("memory address of a:%p,b:%p\n\n", &a, &b)
fmt.Println(macs)
fmt.Printf("memory address of macs:%p\n\n", &macs)
}
/* 實際輸出結果
[MacBook Air, MacBook Pro, Mac mini, iMac, Mac Studio, Mac Pro]
memory address of macs:0xc000066120
[MacBook Air, MacBook Pro] [MacBook Pro, Mac mini]
memory address of a:0xc000010018,b:0xc000010030
[MacBook Air, XXX] [XXX, Mac mini]
memory address of a:0xc000010018,b:0xc000010030
[MacBook Air, XXX, Mac mini, iMac, Mac Studio, Mac Pro]
memory address of macs:0xc000066120
*/
第 32 行的記憶體位址 (從 16 行 print 出的),是最一開始 macs 的記憶體位址 (0xc000066120)
第 35 行的記憶體位址 (從 21 行 print 出的),是最一開始 a、b 的記憶體位址 (a:0xc000010018,b:0xc000010030)
第 38 行的記憶體位址 (從 25 行 print 出的),是將 b[0]
修改為 "XXX"
後的記憶體位址 (a:0xc000010018,b:0xc000010030)
第 41 行的記憶體位址 (從 27 行 print 出的),是將 b[0]
修改為 "XXX"
後 macs 的記憶體位址 (0xc000066120)
可以看到在對 slices 做修改的時候,其實在 Array 的記憶體位址上進行修改
在前一天有介紹過使用 for 迴圈來進行迭代,所以就來簡單示範一下
【하나, 둘, ready, get set, go】Day 6 - for 迴圈
package main
import "fmt"
func main() {
ary := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
for index, value := range ary {
fmt.Printf("index %d,value %d\n", index, value)
}
}
/* 實際輸出結果
index 0,value 0
index 1,value 1
index 2,value 2
index 3,value 3
index 4,value 4
index 5,value 5
index 6,value 6
index 7,value 7
index 8,value 8
index 9,value 9
*/
今天簡單介紹了 Go 的 Array、Slices 用法
在實務上,Slices 比起 Array 更常被使用
下一篇會來介紹 struct 的用法
明天見~