10、map

!!!!!!!!!!!!!!! http://studygolang.com/pkgdoc  非常好的一个标准库网站

01、map 定义

--定义:map是一种w无序的基于key-value的数据结构,map是引用类型,必须初始化才能使用
    --map也是动态扩容的,需要初始化容器大小的

--形式:
    --map[KeyType]ValueType
        --KeyType:表示键的类型
        --ValueType:表示键对应的值的类型

--map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为:
    --make(map[KeyType]ValueType, [cap])
    --其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量

--代码示例如下:
	var m1 map[string]int         // 初始化
	m1 = make(map[string]int, 10) // 分配内存
	fmt.Println(m1 == nil)        // 不分配map会报此错误 ==> panic: assignment to entry in nil map
	m1["理想"] = 18
	m1["姬无名"] = 35

	fmt.Println(m1)  // map[姬无名:35 理想:18]

02、从 map 数据类型 及 验证是否存在

--使用 v, ok 接受map查询结果
	var m1 map[string]int         // 初始化
	m1 = make(map[string]int, 10) // 分配内存
	m1["理想"] = 18
	m1["姬无名"] = 35

	// 验证是否存在 "娜扎" 这个值
	v, ok := m1["娜扎"]
	if !ok {
		fmt.Println("经查证确无此人")
	} else {
		fmt.Println(v)
	}

03、map遍历

--哈哈哈,无师自通,和python真的像,除了不能默认初始化之外
	var rangemap map[string]string
	rangemap = make(map[string]string, 10)

	rangemap["江苏"] = "苏州"
	rangemap["福建"] = "福州"
	rangemap["安徽"] = "安庆"

	//遍历 k, v
	for k, v := range rangemap {
		fmt.Println(k, v)
	}

    //只遍历 key
    for k := range rangemap{
    }

    //只遍历value
    for _, v := range rangemap{
    }
********************  输出结果  ************************
江苏 苏州
福建 福州
安徽 安庆

04、删除map中元素值

--删除元素中map值:
	var rangemap map[string]string
	rangemap = make(map[string]string, 10)

	rangemap["江苏"] = "苏州"
	rangemap["福建"] = "福州"
	rangemap["安徽"] = "安庆"
	rangemap["河北"] = "保定"

	fmt.Println(rangemap)

	// 删除map中元素
    // 值得注意的是,这里如果删除的元素不存在于map之中不会报错只是会不处理罢了
	delete(rangemap, "河北")
	fmt.Println(rangemap)

--注:delete函数在内置库的builtin中,built和fmt一样是内置库

05、一个小小的汇总应用 -- 间隔一段时间之后再看map时的感触

package main

import "fmt"

func main() {
	var m1 map[string]string

	m1 = make(map[string]string, 10)  // 1、必须在初始化之后给map分配内存空间大小
	m1["name"] = "liming"
	m1["age"] = "35"

    // 检查键值是否存在方式一
	value, ok := m1["age"]
	if !ok {  // 2、ok是键值,这一点和其他的顺序不同
		fmt.Println("查无此 key")
	} else {
		fmt.Println(value)
	}

    // 检查键值是否存在方式二
	// fmt.Println(m1["birthday"])  如果为空不会报错,其输出为0[int] 或 “”[string]

}

06、生成一个随机的map,对map的key排序之后,按照对应简直关系输出排序好之后的新的map

package main

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

func main() {
	rand.Seed(time.Now().UnixNano()) //初始化随机数种子

	var scoreMap = make(map[string]int, 200)

	for i := 0; i < 100; i++ {
		key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串
		value := rand.Intn(100)          //生成0~99的随机整数
		scoreMap[key] = value
	}
	//取出map中的所有key存入切片keys
	var keys = make([]string, 0, 200)
	for key := range scoreMap {
		keys = append(keys, key)
	}
	//对切片进行排序
	sort.Strings(keys)
	//按照排序后的key遍历map
	for _, key := range keys {
		fmt.Println(key, scoreMap[key])
	}
}

07、map 和 slice的互相嵌套 -- 列表中含有字典  以及  字典中元素为列表

--按照python来理解就是:
    --[{}, {}, {}, ......]
    --{
        "":[],
        "":[],
        ... ...
      }


--代码示例如下:
package main

// 元素类型为map的字典,即列表中含字典
import (
	"fmt"
)

func main() {
	// 01、切片中元素为map
	// var s1 = make([]map[int]string, 0, 10) // 定义一个切片,元素为map,切片长度为0,容量为10
	var s1 = make([]map[int]string, 10, 10)

	// 这里有一个大坑,就是我们只初始化了slice,没有初始化每个map元素
	// s1[0][100] = "liming" // 会报错 panic: index out of range 因为这里长度设置为0,因此这种情况下长度一般和容量一致
	// 当设置了长度为10以后会报错 panic: assignment to entry in nil map,即没有分配容量给map

	// 先分配内存,再使用
	s1[0] = make(map[int]string, 1)
	s1[0][0] = "liming"
	fmt.Println(s1[0][0]) // liming
	fmt.Println(s1[0])    // map[0:liming]
	fmt.Println(s1)       // [map[0:liming] map[] map[] map[] map[] map[] map[] map[] map[] map[]]

	// 02、map中含有切片
	var m1 = make(map[string][]int, 10) // 定义一个map, 其value为int的slice类型,容量为10
	m1["北京"] = []int{10, 20, 30}
	fmt.Println(m1)
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值