Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。

参考文档

https://www.liwenzhou.com/posts/Go/08_map/

package main

import "fmt"

func main() {
//指针类型,只声明不会开辟内存地址
var a map[string]string
fmt.Println(a) //map[]
fmt.Println(a == nil) //true
fmt.Printf("%p\n", a) //0x0
//a["name"]="wang" // 没有开辟内家空间不能赋值
//fmt.Println(a) //使用make开辟内存地址
var b = make(map[string]string)
fmt.Println(b) //map[]
fmt.Println(b == nil) //false
fmt.Printf("%p\n", b) //0xc000064390
b["name"] = "wang"
fmt.Println(b) //map[name:wang] //声明时直接赋值 写在一行
var c = map[string]string{"name":"lisi"} //map[name:lisi]
fmt.Println(c) //声明时直接赋值 分行写
var d = map[string]string{
"name":"wangwu",
}
fmt.Println(d) //map[name:wangwu] //key不存在时,会新增单元
d["age"] = "18"
fmt.Println(d) //map[age:18 name:wangwu] //key存在时会更新单元里的值
d["age"] = "19"
fmt.Println(d) //map[age:19 name:wangwu] //删除 删除时有key就会删除,没有时也不会报错
delete(d,"age") //map[name:wangwu]
fmt.Println(d) //取key对应的v key存在返回对应的值, key不存在返回类型对应的默认值
fmt.Println(d["name"]) //wangwu //key存在时返回对应值 第二返回值参数 ok表示key存不存在 bool
v,ok :=d["name"]
fmt.Println(v,ok) //wangwu true
//key不存在时返回对应的默认值 "" false
v2,ok2 :=d["age"]
fmt.Println(v2,ok2) //"" false //循环
scoreMap := make(map[string]int)
scoreMap["张三"] = 90
scoreMap["小明"] = 100
scoreMap["娜扎"] = 60
//循环 遍历k,v
for k,v :=range scoreMap{
fmt.Println(k,v)
}
//只遍历k
for k := range scoreMap {
fmt.Println(k)
}
//只遍历v
for _,v:=range scoreMap{
fmt.Println(v)
}
}

按照指定顺序遍历map

func main() {
rand.Seed(time.Now().UnixNano()) //初始化随机数种子 var scoreMap2 = make(map[string]int, 10) for i := 0; i < 10; i++ {
key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串
value := rand.Intn(10) //生成0~99的随机整数
scoreMap2[key] = value
}
//取出map中的所有key存入切片keys
var keys = make([]string, 0, 20)
for key := range scoreMap2 {
keys = append(keys, key)
}
//对切片进行排序
sort.Strings(keys)
//按照排序后的key遍历map
for _, key := range keys {
fmt.Println(key, scoreMap2[key])
}
}
打印结果:
stu00 2
stu01 5
stu02 6
stu03 6
stu04 1
stu05 2
stu06 8
stu07 8
stu08 0
stu09 4

元素为map类型的切片

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

func main()  {
var mapSlice = make([]map[string]string, 3)
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
fmt.Println("after init")
// 对切片中的map元素进行初始化
mapSlice[0] = make(map[string]string, 10)
mapSlice[0]["name"] = "小王子"
mapSlice[0]["password"] = "123456"
mapSlice[0]["address"] = "沙河"
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
}
打印结果:
index:0 value:map[]
index:1 value:map[]
index:2 value:map[]
after init
index:0 value:map[address:沙河 name:小王子 password:123456]
index:1 value:map[]
index:2 value:map[]

值为切片类型的map

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

func main()  {
//map映射
//只完成了map的初使化
var mapslice = make(map[string][]int,8)
v,ok := mapslice["china"]
if ok {
fmt.Println(v)
}
mapslice["china"] =make([]int,8) //完成切片的初使化
mapslice["china"][0] = 100
mapslice["china"][1] = 200
mapslice["china"][3] = 300
fmt.Println(mapslice)
for k,v:=range mapslice {
fmt.Println(k,v)
}
}

打印效果:

map[china:[100 200 0 300 0 0 0 0]]
china [100 200 0 300 0 0 0 0]

练习题

写一个程序,统计一个字符串中每个单词出现的次数。比如:”how do you do”中how=1 do=2 you=1

func test2(){
func test2(){
var s = "how do you do"
var wordmap = make(map[string]int,10)
var words = strings.Split(s," ")
fmt.Println(words) //[how do you do]
for _,word:=range words {
v,ok := wordmap[word]
fmt.Println(v,ok)
if ok {
wordmap[word] = v + 1
}else{
wordmap[word] = 1
} } for k,v :=range wordmap {
fmt.Println(k,v)
}
}
打印结果:
[how do you do]
0 false
0 false
0 false
1 true
do 2
how 1
you 1

p24 map 之 golang基础的更多相关文章

  1. GoLang基础数据类型--->字典(map)详解

    GoLang基础数据类型--->字典(map)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   可能大家刚刚接触Golang的小伙伴都会跟我一样,这个map是干嘛的,是 ...

  2. golang基础知识之encoding/json package

    golang基础知识之json 简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.可以去json.org 查看json标准的清晰定义.json pack ...

  3. Golang基础之函数

    golang基础之函数 1.为什么需要函数? 有些相同的代码可能出现多次,如果不进行封装,那么多次写入到程序中,会造成程序冗余,并且可读性降低 2.什么是函数 为完成某些特定功能的程序指令集合称为函数 ...

  4. Golang 基础之基础语法梳理 (三)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第三章节 Golang 基础之基础语法梳理 (一) Gol ...

  5. Golang 基础之基础语法梳理 (一)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第一章节 Golang 基础之基础语法梳理 (一) Gol ...

  6. Golang基础教程

    以下使用goland的IDE演示,包含总计的golang基础功能共20个章节 一.go语言结构: 二.go基础语法: 三.变量 四.常量 五.运算符 六.条件语句 七.循环 八.函数 九.变量作用域 ...

  7. GoLang基础数据类型-切片(slice)详解

    GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...

  8. GoLang基础数据类型--->数组(array)详解

    GoLang基础数据类型--->数组(array)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Golang数组简介 数组是Go语言编程中最常用的数据结构之一.顾名 ...

  9. GoLang基础数据类型--->字符串处理大全

    GoLang基础数据类型--->字符串处理大全 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 欢迎加入:   高级运维工程师之路               59843264 ...

随机推荐

  1. 编写批处理使用msbuild编译项目

    echo off ::请把此bat脚本放到以下代码路径下 并在环境变量中配置对应版本的vs编译器的值 ::vs2017如:C:\Program Files (x86)\Microsoft Visual ...

  2. AcWing:111. 畜栏预定(贪心 + 小根堆)

    有N头牛在畜栏中吃草. 每个畜栏在同一时间段只能提供给一头牛吃草,所以可能会需要多个畜栏. 给定N头牛和每头牛开始吃草的时间A以及结束吃草的时间B,每头牛在[A,B]这一时间段内都会一直吃草. 当两头 ...

  3. DMA数据传输

    从字面意思上看,DMA即为“直接内存读取”的意思,换句话说DMA就是用来传输数据的,它也属于一个外设.只是在传输数据时,无需占用CPU. 高速IO设备可以在处理器安排下直接与主存储器成批交换数据,称为 ...

  4. flask 第八篇 实例化flask时的参数配置

    Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...

  5. (一)C语言的四大数据类型

  6. SRS之SrsConfig类

    1. 类定义 1.1 SrsConfig 类 /** * the config service provider. * for the config supports reload, so never ...

  7. python sqlalchemy 进行 mysql 数据库操作

    1. 进行mysql数据库的创建,如果已经存在,就相当于进行数据库的连接操作 from sqlalchemy import create_engine from sqlalchemy.ext.decl ...

  8. 连续子数组的最大和 java实现

    package findMax; /** * 连续子数组的最大和 * @author root * */ public class FindMax { static int[] data = {1,- ...

  9. LC 562. Longest Line of Consecutive One in Matrix

    Given a 01 matrix M, find the longest line of consecutive one in the matrix. The line could be horiz ...

  10. MySQL 存储过程 函数 routine 权限

    MySQL 存储过程 函数 routine 权限 Table of Contents 1. mysql存储过程/函数权限 1.1. 相关对象操作权限检查 1.2. 执行权限 1 mysql存储过程/函 ...