Go语言基础之map

map

map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

map定义

Go语言中 map的定义语法如下:

map[KeyType]ValueType

其中,

  • KeyType:表示键的类型。
  • ValueType:表示键对应的值的类型。

map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为:

make(map[KeyType]ValueType, [cap])  // 容量

其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量否则就会动态扩张

map基本使用

map中的数据都是成对出现的,map的基本使用示例代码如下:

func main() {
    var m1 map[string]int  //
    fmt.Println(m1==nil) // 还没有初始化(没有在内存中开辟空间)
    m1 = make(map[string]int,10)  // 初始化,开辟内存空间,要估算好,避免再动态扩容
    m1["json_sb"] = 48
    m1["tank_sb"] = 38
    fmt.Println(m1)
    fmt.Println(m1["json_sb "])

简写:
m1 := make(map[string]int,10)

map也支持在声明的时候填充元素,例如:

func main() {
	userInfo := map[string]string{
		"username": "沙河小王子",
		"password": "123456",
	}
	fmt.Println(userInfo) //
}

判断某个键是否存在

Go语言中有个判断map中键是否存在的特殊写法,格式如下:

value, ok := map[key]

举个例子:

func main() {
	scoreMap := make(map[string]int)
	scoreMap["张三"] = 90
	scoreMap["小明"] = 100
	// 如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值
	v, ok := scoreMap["张三"]
	if ok {
		fmt.Println(v)
	} else {
		fmt.Println("查无此人")
	}
}

map的遍历

Go语言中使用for range遍历map。

func main() {
	scoreMap := make(map[string]int)
	scoreMap["张三"] = 90
	scoreMap["小明"] = 100
	scoreMap["娜扎"] = 60
	for k, v := range scoreMap {
		fmt.Println(k, v)
	}
}

但我们只想遍历key的时候,可以按下面的写法:

func main() {
	scoreMap := make(map[string]int)
	scoreMap["张三"] = 90
	scoreMap["小明"] = 100
	scoreMap["娜扎"] = 60
	for k := range scoreMap {
		fmt.Println(k)
	}
}

注意: 遍历map时的元素顺序与添加键值对的顺序无关。

使用delete()函数删除键值对

使用delete()内建函数从map中删除一组键值对,delete()函数的格式如下:

delete(map, key)

其中,

  • map:表示要删除键值对的map
  • key:表示要删除的键值对的键

示例代码如下:

func main(){
	scoreMap := make(map[string]int)
	scoreMap["张三"] = 90
	scoreMap["小明"] = 100
	scoreMap["娜扎"] = 60
	delete(scoreMap, "小明")//将小明:100从map中删除
	for k,v := range scoreMap{
		fmt.Println(k, v)
	}
}

按照指定顺序遍历map

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])
	}
}

元素为map类型的切片

下面的代码演示了切片中的元素为map类型时的操作:

package main

import "fmt"

// map和slice组合
func main() {
    // 1.先定义元素类型为map的切片
    var s1 = make([]map[int]string,10,10)   // map切片类型,10长度,10容量
    // 2.需要对内部的元素map做初始化,给内存空间
    s1[0] = make(map[int]string,1)  // 1为开辟的内存空间
    s1[0][2] = "sb"
    fmt.Println(s1)

    var s2 = make([]int,10,10)
    fmt.Println(s2)

    // map类型值为“切片”
    var m1 = make(map[string][]int,10)  // 为切片开辟10容量内存空间
    fmt.Println(m1)
    m1["北京"] = []int{10,20,30}
    fmt.Println(m1)
}

值为切片类型的map

map的类型值为切片

下面的代码演示了map中值为切片类型的操作:

func main() {
	var sliceMap = make(map[string][]string, 10) // 位切片开辟10的容量内存空间
	fmt.Println(sliceMap)
	fmt.Println("after init")
	key := "中国"
	value, ok := sliceMap[key]
	if !ok {
		value = make([]string, 0, 2)
	}
	value = append(value, "北京", "上海")
	sliceMap[key] = value
	fmt.Println(sliceMap)
}

练习题

  1. 写一个程序,统计一个字符串中每个单词出现的次数。比如:”how do you do”中how=1 do=2 you=1。
  2. s1 := "how do you do"
        ret := strings.Split(s1," ")
        fmt.Println(ret)
        m1 := make(map[string]int,10)
        for _,v :=range ret{
            _,ok := m1[v]
            if !ok{
                m1[v] = 1
            }else {
                m1[v]++
            }
        }
        fmt.Println(m1)

原文地址:https://www.cnblogs.com/wukai66/p/11973507.html

时间: 2024-11-02 23:39:04

Go语言基础之map的相关文章

Go语言 基础 map

Go语言基础之map Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现. map map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用. map定义 Go语言中 map的定义语法如下: map[KeyType]ValueType 其中, KeyType:表示键的类型. ValueType:表示键对应的值的类型. map类型的变量默认初始值为nil,需要使用make()函数来分配内存.语法为: make(map[KeyType]

Go学习笔记(2) 语言基础和数值布尔类型

  1. Go语言环境变量 Go语言开发环境依赖一些操作系统环境变量,常用的环境变量如下: $GOROOT 表示 Go 在你的电脑上的安装位置,它的值一般都是 $HOME/go,当然,你也可以安装在别的地方. $GOARCH 表示目标机器的处理器架构,它的值可以是 386,amd64 或 arm. $GOOS 表示目标机器的操作系统,它的值可以是 darwin,freebsd,linux 或 windows $GOBIN 表示编译器和链接器的安装位置,默认是 $GOROOT/bin,如果你使用的

Java_Web三大框架之Hibernate+HQL语言基础

12.1 HQL语言基础Hibernate查询语言为HQL(Hibernate Query Language),可以直接使用实体类名及属性.HQL语法类似于SQL,有SQL的关键词如select.from.order by.count().where等等.不同的是HQL是一种完全面向对象的语言,能够直接查询实体类及属性.12.1.1 HQL语法HQL语法类似于SQL,是一种select...from...的结构.其中,from后跟的是实体类名,而不是表名.select后面跟的可以是实体对象,也可

Go 语言基础语法

Go 语言基础语法 上一章节我们已经了解了 Go 语言的基本组成结构,本章节我们将学习 Go 语言的基础语法. Go 标记 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号.如以下 GO 语句由 6 个标记组成: fmt.Println("Hello, World!") 6 个标记是(每行一个): 1. fmt 2. . 3. Println 4. ( 5. "Hello, World!" 6. ) 行分隔符 在 Go 程序中,一行代表一个语句

新书:Scala语言基础与开发实战

大数据科学丛书系列的最新一本<Scala语言基础与开发实战>即将面市,预计月底上架.内容还是不错的,文笔简介,内容实用,值得学.用. 大数据资深培训师王家林新作. 详细介绍大数据开发语言Scala及其在分布式框架Akka和Kafka中的应用. 秉承"实战"类图书特点,解析大量代码的编写操作,具有较强的可操作性,便于读者学习和理解. 算上再过几个月出版的<Spark内核解析及性能调优>,一年时间,大数据科学丛书系列之Spark的小套系基本形成了:从学习Spark的

go语言基础教程

Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本.现在Go的开发已经是完全开放的,并且拥有一个活跃的社区. Go 语言环境安装 Go 语言支持以下系统: Linux FreeBSD Mac OS X(也称为 Darwin)

Go语言开发(二)、Go语言基础

Go语言开发(二).Go语言基础 一.Go语言程序结构 Go语言程序基本结构如下:A.包声明B.引入包C.函数D.变量E.语句 & 表达式F.注释 package main //包声明 import "fmt" //引入包 func main(){ //main函数 //打印Hello World fmt.Print("Hello World!") } 二.Go语言基础语法 1.Go语言标记 Go语言程序由多个标记组成,可以是关键字.标识符.常量.字符串.符

D03——C语言基础学习PYTHON

C语言基础学习PYTHON--基础学习D02 20180804内容纲要: 1 函数的基本概念 2 函数的参数 3 函数的全局变量与局部变量 4 函数的返回值 5 递归函数 6 高阶函数 7 匿名函数 8 函数式编程 9 小结 10 小练习:ATM+购物车程序 1 函数的基本概念 a 函数定义 b 函数特性 c 定义函数 a 定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. b 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 c:语法

Go语言 基础 指针

Go语言基础之指针 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 Go语言中的函数传参都是值拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量.传递数据使用指针,而无须拷贝数据.类型指针不能进行偏移和运算.Go语言中的指针操作非常简单,只需要记住两个符号:&(取地址)和*(根据地址取值). 指针地址和指针类型 每个变量在运行时都拥有一个地址,这个地