1. 程式人生 > 實用技巧 >mormot對windows websocket的封裝

mormot對windows websocket的封裝

Golang map

目錄

宣告

var map identifier [keytype]valuetype

Java中的HashMap相似, 可以使用多種型別作為key,

但是除slice, map, function

注意: 宣告是不會分類記憶體的, 初始化需要make, 分配記憶體後賦值使用

  • 相同的key, 會覆蓋之前的值
  • key-value無序
  • len(map)獲取mapsize

使用

方式一: make

func main() {
	var m map[string]string
	m = make(map[string]string, 10)
	m["張三"] = "sandy"
	m["李四"] = "swagger"
	m["王五"] = "woody"
	fmt.Println(m)
}

方式二: 直接宣告

func main() {
	//注意區別於陣列arr := [...]string{0:"張三",1:"李四",2:"王五"}
	m := map[string]string{
        "張三": "sandy",
        "李四": "swagger"}
	m["王五"] = "woody"
	fmt.Println(m)
}

特殊使用

func main() {
	//以map為value
	m:= map[string]map[string]string{
		"101" : {"name":"張三","gender":"1"},
		"102" : {"name":"李四","gender":"1"},
	}
	print("----------------------------")
	m = make(map[string]map[string]string)
	//如果未在宣告時賦值, 需要malloc一塊空間
	m["101"] = make(map[string]string)
	m["101"]["name"] = "張三"
	m["101"]["gender"] = "男"
	m["102"] = make(map[string]string)
	m["102"]["name"] = "李四"
	m["102"]["gender"] = "男"
}

通用操作

新增/C

func main() {
	m := map[int]string{}
	m[1] = "張三"
	fmt.Println(m)
}

查詢/R

func main() {
	m := map[int]string{}
	m[1] = "張三"
	m[2] = "李四"
	m[3] = "王五"
	//通過key查詢,val為對應key的value, flag為是否存在
	val,flag := m[3]
	fmt.Println(val)
	fmt.Println(flag)
}

更新/U

func main() {
	m := map[int]string{}
	m[1] = "張三"
	m[2] = "李四"
	//覆蓋key為2的k-v
	m[2] = "王五"
	fmt.Println(m)
}

刪除/D

func main() {
	m := map[int]string{}
	m[1] = "張三"
	m[2] = "李四"
	m[3] = "王五"
	fmt.Println(m)
	//刪除指定的key
	delete(m, 2)
	fmt.Println(m)
    //刪除map,將指標指向一個新的地址, 原先的map被GC
	m = make(map[int]string)
}

map遍歷

func traverse(m map[int]string){
	for key, val := range m {
		fmt.Println(key,val)
	}
}
func main() {
	m := map[int]string{}
	m[1] = "張三"
	m[2] = "李四"
	m[3] = "王五"
	traverse(m)
}
func main() {
	//以map為value
	m:= map[string]map[string]string{
		"101" : {"name":"張三","gender":"1"},
		"102" : {"name":"李四","gender":"1"},
	}
	for k1, nestedMap := range m {
		for k2, val := range nestedMap {
			fmt.Println(k1,k2,val)
		}
	}
}

map切片

注意!!!切片是有序的

func main() {
	//初始了一個長度為1的切片
	m := []map[string]string{
        {
			"name": "丁一",
		},
    }
	//使用切片前必須初始化
	m = make([]map[string]string, 5)
	//初始化map
	m[0] = make(map[string]string)
	m[0]["name"] = "狗二"
	//切片是有序的,append在切片的末尾新增
	m = append(m, map[string]string{
		"name": "張三",
	})
	fmt.Println(m)
}

map排序

注意!!!, 新版的Golang, 如果key是數值型別按照從小到大排序, 如果是字元或是字串按照字典序

func main() {
	//key如果是數字按照從小到達, 如果是字串按照字典序排序
	m := map[string]int{
		"z":100,
		"abc":  200,
		"ab": 12,
		"za":  399,
		"ba":  231,
	}
	fmt.Println(m)
}

舊版

func main() {
 
   m := map[int]int{
      1:  200,
      10: 12,
      4:  399,
      2:  231,
   }
   fmt.Println(m)
   var keys []int
   for key, _ := range m {
      keys = append(keys, key)
   }
   //將int slice按照從小到大排序
   sort.Ints(keys)
   fmt.Println(keys)
   for _, val := range keys {
      fmt.Println(val,m[val])
   }
}