iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
Software Development

30天學會Golang系列 第 3

Day03 - Go的 map 與 struct

  • 分享至 

  • xImage
  •  

map

在 Go 中,Map 與其他語言的 Dict 字典相似,也是 Key-Value pair 的組合,但是 Map 所有 Key 的資料型別都要一樣,且所有 Value 的資料型別也要一樣。map 的 zero value 是 nil,設值和取值需要使用 [] 而非 .。以2020年台灣的選舉來舉例,有三組總統與副總統候選人,用map的形式可寫成如下

func main() {
    presidentialCandidate := map[int]string{
		1: "宋楚X",
		2: "韓國X",
		3: "蔡英X",
	}
	vicePresidentialCandidate := map[string]string{
		"宋楚X": "余X",
		"韓國X": "張善X",
		"蔡英X": "賴清X",
	}
}

day04 會有搭配這個例子的範例,敬請期待一下

struct

struct的宣告比較沒有特別之處,跟一般的程式碼宣告 struct 或 class 相似,都需要宣告在函數之外,函數會於 day04 說明,所以也不特別贅述, struct 的舉例如下

type Presidential struct {
	Id   int
	Name string
}

func main() {
    president := []Presidential{
        {Id: 1, Name: "宋楚X"},
        {Id: 2, Name: "韓國X"},
        {Id: 3, Name: "蔡英X"}}
        fmt.Println(president)
    }
}

輸出結果為:

[{1 宋楚X} {2 韓國X} {3 蔡英X}]

但其實也可以 struct 中,也組合其他的 struct ,我們將總統跟副總統候選人寫成一個 Nominate 的 struct ,再將其包裝到 ElectionCandidates 中,與 Id 綁再一起,那麼可寫成如下

type Nominate struct {
	President     string
	VicePresident string
}

type ElectionCandidates struct {
	Id     int
	Couple Nominate
}

func main() {
    electionCandidates := []ElectionCandidates{
		{Id: 1, Couple: Nominate{President: "宋楚X", VicePresident: "余X"}},
		{Id: 2, Couple: Nominate{President: "韓國X", VicePresident: "張善X"}},
		{Id: 3, Couple: Nominate{President: "蔡英X", VicePresident: "賴清X"}},
	}
	fmt.Println(electionCandidates)
}

輸出結果為:

[{1 {宋楚X 余X}} {2 {韓國X 張善X}} {3 {蔡英X 賴清X}}]

map 與 struct

這兩者看似相識,但其實在應用上有顯著不同的地方,以下是節錄至 PJCHENder [Golang] maps 的解說,根據不同的應用目的,選擇適合的工具,值得一提的是能否迭代的問題,假設如果需要知道資料有多少筆數,以及分別將其取出的情況下,那會建議使用 map ,但如果想要架構一個多屬性的結構的話,那就可以考慮使用 struct

Map Structure
所有的 key 都需要是相同型別 所有的 value 都需要是相同型別 value 可以是不同型別
Key 有被 indexed,因此可以進行迭代,列出所有的 key-value pairs Key 沒有被 indexed,因此沒辦法透過迭代的方式列出所有的 key-value pair
Reference Type Value Type
通常用在資料集合關聯性非常強的資料,例如 colors 通常用在一個帶有多種屬性的東西,例如 person
不用一開始就知道所有的 key 有哪些,因為可以後續新增和刪除 需要一開始就清楚定義所有的欄位

實際上兩者也是可以做結合使用,可以透過 map 來綁 struct ,範例如下

type Nominate struct {
	President     string
	VicePresident string
}

func main() {
    electionCandidates := map[int]Nominate{
        1: {"宋楚X", "余X"},
        2: {"韓國X", "張善X"},
        3: {"蔡英X", "賴清X"},
    }
    fmt.Println(electionCandidates)
}

輸出結果為:

map[1:{宋楚X 余X} 2:{韓國X 張善X} 3:{蔡英X 賴清X}]
第3天報到,政治議題,有點尷尬...

參考來源

  1. https://pjchender.dev/golang/maps/
  2. https://pjchender.dev/golang/structs/

代碼連結

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


上一篇
Day02 - Go的 const 常數宣告與 if / switch 判斷式
下一篇
Day04 - Go的 for 迴圈與 func 函數
系列文
30天學會Golang31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
obarisk
iT邦研究生 1 級 ‧ 2022-09-14 17:38:07

map 跟 struct 看起來有一樣的地方嗎?
通常 map 應該接在 array 跟 slice 後面講

gsn915315 iT邦新手 5 級 ‧ 2022-09-15 10:55:55 檢舉

@obarisk 謝謝你的回覆,將 array 跟 slice 放後面是因為會帶到指標的概念,相對複雜,所以放到後面的部分說明;先講 map 跟 struct 是因為先了解這個會對處理基本資料會比較有感覺,至少可以將收到的資料先做些處理,而不單只是把程式碼當計算機,因為之前看其他書,前面都在講資料計算的部分,難免會覺得有點疲乏,所以想說稍微換一下順序試試看,會不會比較容易引起興趣。所以我這幾篇可能會先把比較簡單實用的概念先放前面簡單帶過,然後最後面幾天應該會找一兩個實用的例子把前面提到的概念一一整合例子裡面,但後面我也還沒完成,正在努力中...,總之謝謝你的建議,我後面會再做些調整

我要留言

立即登入留言