iT邦幫忙

2022 iThome 鐵人賽

DAY 5
1
Software Development

30天學會Golang系列 第 5

Day05 - Go的 Array & Slice 與 interface (上)

  • 分享至 

  • xImage
  •  

Array & Slice

Array

array的宣告也類似其他語言,這邊就簡單帶過

// var array名稱 [可存取的數量]類型  
var arr1 [5]int // array名稱 = arr1, 可存取的數量 = 5, 類型 = int, 內容為[0, 0, 0, 0, 0]

// arr2 等價於 arr3
arr2 := [5]int{0, 0, 0, 0, 0}
arr3 := [...]int{0, 0, 0, 0, 0}

// 2維陣列
var grid [2][4]int

Slice

相較於array,在go當中實際上比較常用slice,因為他的擴展性更高,下面是他的宣告方式

// 方式一: []中先不定義大小
arr1 := []int{0, 0, 0, 0, 0}

// 方式二: 用 make 的方式
arr2 := make([]int, 5)

// 方式三:空的 slice,一般會搭配 append 使用
var arr []int

上面的 array 與 slice 看起來很相似,但實際上他們有本質上的差別, array 是單純在記憶體上的資料,而 slice 則是會建立兩個不同的資料結構,分別是 slice 和 array ,聽起來很詭異對吧,實際情況可以參考下面的示意圖,這是從下面的參考網站擷取出來的,可以看到當 slice 建立時,會分成左邊的 slice 區塊,與右邊的 array 區塊,左邊的 slice 指的其實是指標(ptr to head)與內容的數量(length、capacity,至於這兩者的差異,其實有一些特性上的差別,但不是本篇探討的方向,所以就不加贅述,有興趣可以看看參考來源2)及 array (記憶體中紀錄的 array 數值),用 slice 的好處是當資料傳遞時僅需要傳遞指標等內容,不需要將整串的 array 內容都拿來傳遞,可以降低記憶體的使用量,聽起來很不錯吧,具體如何使用,我們之後的範例會再引用,先有個印象就好

https://ithelp.ithome.com.tw/upload/images/20220916/20150797ihlQBcof7c.png

參考至: https://pjchender.dev/golang/slice-and-array/

interface

我們前面有提到使用 map 的時候我們必須是先定義 key 與 value 需要相同,但是假設今天我們想要處理各種資料型態,又不想為每種情況都特別寫一個 map 時,interface 就是個好伙伴,他基本上就是什麼資料型態都可以接收的意思,以下為例:

func main() {
    list := map[string]interface{}{
        "水果": "頻果",
        "數量": 5,
    }
    for i, v := range list {
        fmt.Printf("key: %v, value: %v \n", i, v)
    }
}

輸出結果為:

key: 水果, value: 頻果 
key: 數量, value: 5 

在 map 中,原本 Key-Value 的 Value 原本只能是 同樣類型的配對,但是透過 interface 的方式,使得 Value 可以承裝 "頻果" (string)、 5 (int)的型別,那麼是代表 Key 的部分也可以變成 interface 呢?

func main() {
    list := map[interface{}]interface{}{
        "水果": "頻果",
        "數量": 5,
        7:    "保存期限",
    }
    for i, v := range list {
        fmt.Printf("key: %v, value: %v \n", i, v)
    }
}

輸出結果為:

key: 水果, value: 頻果 
key: 數量, value: 5 
key: 7, value: 保存期限 

證明 interface 可用的範圍很廣,如果所需的資料為不同類型,可以使用 interface 來完成。
但是 interface 的用途還不僅僅單純只是這樣,下一篇 Day06 我們會介紹有關更深以及更難但是對於大型程式碼開發時很實用的功能,可以期待一下。

第5天報到,今天終於沒有政治了,但是例子好像有點無聊,好像少了一點什麼,嗯...,明天來點不一樣的好了

參考來源

  1. https://pjchender.dev/golang/slice-and-array/
  2. https://gosamples.dev/capacity-and-length/

代碼連結

https://github.com/luckyuho/ithome30-golang/tree/main/day05


上一篇
Day04 - Go的 for 迴圈與 func 函數
下一篇
Day06 - Go的 interface (下)
系列文
30天學會Golang31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言