Go语言Map类型

1.map定义

  • map类型是一个key-value的数据结构
// var m map[key的类型]value的类型
var a map[string]int
var b map[int]strig
var c map[float]string

2.map声明

package main

import "fmt"

func main() {
    // m := map[string]int{}
    var m map[string]int
    fmt.Println(m)  // map[]
}

3.初始化

package main

import "fmt"

func main() {
    var m map[string]int
    // 初始化
    m = make(map[string]int, 15)
    // 插入一个键值
    m["a"] = 1
    fmt.Println(m)  // map[a:1]
}

4.声明的同时初始化

package main

import "fmt"

func main() {
    m := map[string]int{
	"a": 5,
	"b": 10,
	"c": 20,  // 最后的逗号不能丢
    }
    fmt.Println(m)  // map[a:5 b:10 c:20]
}

5.map基本操做

  • 1.取值
m["a"]
  • 2.判断key是否存在
v, ok := m["r"]
if ok {
    fmt.Println(v)
} else {
    fmt.Println("key不存在")
}
  • 3.插入和修改
// 存在a这个key则修改,否则新增
m["a"] = 10
  • 4.删除
delete(m, "a")
  • 5.遍历
package main

import "fmt"

func main() {
    m := map[string]int{
	"a": 5,
	"b": 10,
	"c": 20,
    }
    for k, v := range m {
	fmt.Println(k, "---->", v)
    }
}
  • 6.排序
package main

import (
    "fmt"
    "sort"
)

func main() {
    m := map[string]int{
	"b": 5,
	"a": 10,
	"c": 20,
	"e": 1,
	"g": 2,
	"d": 3,
	"h": 4,
	"f": 9,
    }
    // 1.定义一个空切片,用来保存key
    var keys []string
    // 2.对切片对象进行排序
    for k, _ := range m {
	keys = append(keys, k)
    }
    sort.Strings(keys) // [a b c d e f g h]
    // 3.按照切片顺序取值
    for _, k := range keys {
	fmt.Println(k, "---->", m[k])
    }
}

6.map类型的切片

package main

import "fmt"

func main() {
    // 1.声明一个map类型的切片
    var mapSlice []map[string]string
    // 2.切片初始化
    mapSlice = make([]map[string]string, 5)
    fmt.Println(mapSlice) // [map[] map[] map[] map[] map[]]
    // 3.为切片中的map对象初始化
    mapSlice[0] = make(map[string]string, 10)
    mapSlice[0]["name"] = "jack"
    mapSlice[0]["age"] = "24"
    mapSlice[0]["gender"] = "M"
    fmt.Println(mapSlice) // [map[age:24 gender:M name:jack] map[] map[] map[] map[]]
}

7.切片类型的map

package main

import "fmt"

func main() {
    // 1.声明一个切片类型的map
    var sliceMap map[string][]string
    // 2.初始化map
    sliceMap = make(map[string][]string, 5)
    fmt.Println(sliceMap) // map[]
    // 3.为map中key为hobby的切片对象初始化
    sliceMap["hobby"] = make([]string, 0, 5)
    sliceMap["hobby"] = append(sliceMap["hobby"], "basketball")
    sliceMap["hobby"] = append(sliceMap["hobby"], "football")
    sliceMap["hobby"] = append(sliceMap["hobby"], "badminton")
    fmt.Println(sliceMap) // map[hobby:[basketball football badminton]]
}

8.注意

  • map内部必须使用双引号
  • map是一个引用类型,必须初始化才能使用,否则panic
package main

import "fmt"

func main() {
    m := map[string]int{
	"a": 5,
	"b": 10,
	"c": 20,
    }
    // 引用拷贝,修改m1的值,会影响m的值
    m1 := m
    m1["a"] = 6
    fmt.Println(m)  // map[a:6 b:10 c:20]
    fmt.Println(m1) // map[a:6 b:10 c:20]
}

9.Map与工厂模式

  • map的value可以是一个方法
  • 与Go的Dock type接口方式一起,可以方便的实现单一方法对象的工厂模式
package main

import "fmt"

func main() {
    sliceMap := map[string]func(num int) int{}
    sliceMap["square"] = func(n int) int {
	return n * n
    }
    sliceMap["cube"] = func(n int) int {
	return n * n * n
    }
    fmt.Println(sliceMap["square"](2)) // 4
    fmt.Println(sliceMap["cube"](2))   // 8
}

10.使用map实现集合set

  • Go的内置集合中没有Set实现,可以使用map[type]bool
posted @ 2022-09-20 13:33  fatpuffer  阅读(187)  评论(0)    收藏  举报