Golang - map


定义

  • k - v 的映射关系
  • 无序
  • 引用类型

用法

创建

// 声明
var a map[string]int        // 只声明, 未初始化, 未赋值, map为nil, 不可操作

// 初始化
a = make(map[string]int, 8) // 容量为8, 不为nil, 为空map, 即map[]

// 赋值
a["Tim"] = 100
a["Tom"] = 99

// 简短声明
b := make(map[string]int, 8) // 这里只有一个参数, 与切片要区分

// 声明, 初始化, 并赋值
gender := map[string]int{
	"Tim": 0,
	"Lily": 1,
}


嵌套 map

package main

func main() {
	// 需要依次初始化
	a := make(map[string]map[string]int, 2) // 这是外层初始化

	a["语文"] = make(map[string]int, 2) // 这是内层初始化

	a["语文"]["上"] = 100
	a["语文"]["下"] = 99

	a["数学"] = make(map[string]int, 2) // 这是内层初始化

	a["数学"]["上"] = 100
	a["数学"]["下"] = 100

	// 循环遍历外层 map
	for _, v := range a {
		fmt.Println(v)
	}
}

无序遍历

package main

import (
	"fmt"
	"math/rand"
)

func main() {

	a := make(map[string]int, 5)

	// 制造一个学号和成绩的对应关系
	for i := 0; i < 5; i++ {
		k := fmt.Sprintf("stu%02d", i) // 利用 Sprintf 制造学号
		v := rand.Intn(100)            // 随机一个数字作为成绩
		a[k] = v
	}

	// 默认为无序遍历
	for k,v := range a {
		fmt.Println(k, v)
	}
}

有序遍历

package main

import (
	"fmt"
	"math/rand"
	"sort"
)

func main() {
	a := make(map[string]int, 5)

	// 制造一个学号和数字的对应关系
	for i := 0; i < 5; i++ {
		k := fmt.Sprintf("stu%02d", i) // 利用 Sprintf 制造学号
		v := rand.Intn(100)            // 随机一个数字作为成绩
		a[k] = v
	}

	// 有序遍历: 先将 k 取出, 放入切片先排序, 再按照排序后的切片顺序取出 v

	// 创建一个切片用于存放 k
	keys := make([]string, 0, 5) // 这里长度若不为 0,则会补零值(本例中为" "), 并非我们要的效果

	// map 支持只遍历 k
	for k := range a {
		keys = append(keys, k) // 将 k 依次拿出放入切片
	}

	// 把切片中的元素排序
	sort.Strings(keys)

	// 最后输出结果
	for _, v := range keys {
		fmt.Println(v, a[v])
	}
}


删除

package main

import "fmt"

func main() {
	a := make(map[string]int, 2)

	a["Tom"] = 100
	a["Tim"] = 80

	fmt.Println(a) // map[Tim:80 Tom:100]

	_, ok := a["Tom"]
	if ok {
		// 使用delete(mapName, key), 删除键值对
		delete(a, "Tom")
	}

	fmt.Println(a) // map[Tim:80]
}


判断key是否存在

package main

import "fmt"

func main() {
	a := map[string]int{
		"语文": 100,
		"数学": 99,
	}

	// v, ok := map[key], 重点掌握
	v, ok := a["语文"] // 若 ok 为真, v 为对应的值; 若 ok 为假, 则 v 为空值(int 为 0, []int 为 [])
	if ok {
		fmt.Println(v)
	} else {
		fmt.Println("不存在")
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值