iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Modern Web

就是個Go,我也可以啦!GOGO系列 第 12

2023鐵人賽Day 12 Go的資料結構-map

  • 分享至 

  • xImage
  •  

Map 的基礎

Go 的 map 很像 javascript 的 object, ruby 的 hash , 我們很需要這種 key-value 的資料結構來讓我們的寫法更自由

以下敘述go的map的特性

  • map 對 value 類型沒有限制
  • key 類型應該嚴格定義作為 == 和 != 兩個operator的要求
    • 亦即當key為
      • 基本類型 int , float64 , string 等都可以作為鍵
      • 結構(struct)可以被用作 map 的鍵, 不過有個前提,只要結構中其中一個字段作為鍵,其他字段也都要有資格作為鍵,也就是其他字段也必須可以比較
        • 例:Coordinate 的 x 作為 key 時 y 也要滿足作為 key 的條件(可被比較)
          type Coordinate struct {
              X, Y int
          }
          
    • 亦即key不為
      • 切片:由於切片不是固定大小的,故也沒辦法比較
      • 函數指針、通道和其他包含內部隱藏狀態的類型不可以作為鍵
  • map 不會自動初始化零值,故當沒有賦值時就是nil

初始化

剛剛有提到 map 不會自動初始化零值,故當沒有賦值時就是nil , 也就是map的零值就是nil, 當我們在對map的零值進行操作時,就會錯誤

var m map[string]int 
m["key"] = 1 // 這裡會引發 panic,因為 m 是 nil

所以我們要來談map的初始化

使用複合字面值來建立map類型

  • 什麼是複合字面值
    • 複合字面值(composite literal)由兩部分組成:一部分是類型;另一部分是由大括號{}包裹的字面值
    • struct的複合字面值
       type Person struct {
         FirstName string
         LastName  string
         Age       int
       }
      
      // 使用 field: value 形式初始化      
      
       p := Person{
         FirstName: "John",
         LastName:  "Doe",
         Age:       30,
       }
      
  • 如何使用在go的map
    const (
      StatusOK       = 0
      StatusCreated  = 1     
    )
    
    var data = map[int]string{
      StatusOK: "OK",
      StatusCreated: "created"
    }
    

使用make來初始化

var map1[keytype]valuetype = make(map[keytype]valuetype)
// 簡寫
map1 := make(map[keytype]valuetype)

Map的運用

遍歷

package main

import (
	"fmt"
)

func main() {
	score := make(map[string]int)
	score["tom"] = 60
	score["amy"] = 70

	for k, v := range score {
		fmt.Printf("[%d , %d]", k, v)
	}

	fmt.Println(score)
}

查找和讀

想查找 map 中的某個鍵是否存在時,或者想獲取與某個鍵相關聯的值,可以使用特殊的 "comma ok" 語法。這種語法允許你在一個操作中同時獲取值和確定鍵是否存在

value, ok := myMap[key]
  • value 是 key 在 myMap 中相關聯的值
  • ok 是一個boolean,表示鍵是否在 map 中存在

所以我們就可以這樣使用

if !ok{
 //  "key"不存在
}

刪除資料

若我想要針對小於60的要刪除資料,我可以這樣做

func main() {
	score := make(map[string]int)
	score["tom"] = 50
	score["amy"] = 70

	for k, v := range score {
		if v < 60 {
			delete(score, k)
		}
	}

	fmt.Println(score)
}

以上是針對map先建立基礎


上一篇
2023鐵人賽 Day 11 Go x 我們應該要把函數當成一等公民
下一篇
2023鐵人賽Day 13 Go 的 iota:建立靈活的列舉系統
系列文
就是個Go,我也可以啦!GOGO30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言