iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
Cloud Native

【하나, 둘, ready, get set, go】系列 第 7

【하나, 둘, ready, get set, go】Day 7 - Array、slices

  • 分享至 

  • xImage
  •  

前情提要

我們在前一天介紹了 Go 的 for 迴圈

今天要來介紹的是 Go 的 Array、Slices,兩者非常類似

Array Slices
長度 固定長度 彈性長度

從上面的表格來看,

Array 代表的是一個固定長度的陣列

Slices 代表的是一個彈性長度的陣列

Array

在 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]

Slices

在 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]

Array 的 Reference

而 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 的用法

明天見~


上一篇
【하나, 둘, ready, get set, go】Day 6 - for 迴圈
下一篇
【하나, 둘, ready, get set, go】Day 8 - struct
系列文
【하나, 둘, ready, get set, go】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言