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. 美团小程序框架mpvue入门教程

    mpvue是一个使用 Vue.js 开发小程序的前端框架.框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从 ...

  2. docker之CPU配额参数的混合使用

    在启动容器的时候有很多参数,这里来实践一下与CPU相关的参数. 实例: 创建两个容器,docker10.docker20,让两个容器只运行在CPU0上,然后测试CPU使用率. [root@openst ...

  3. liunx 一些文件下载上传的命令

    xshell 上传 rz sftp 语法: put path/filename.txt Put -r path/文件夹 或者 put “path/filename.txt” Put -r “path/ ...

  4. linux开启数据库远程连接

    1.阿里云开启数据库端口 3306 2. 修改 Mysql-Server 用户配置 mysql -uroot -p(注意此用户必须要有最高级权限才行 默认root用户) mysql> USE m ...

  5. HearthstoneBot

    https://github.com/ChuckFork/HearthstoneBot Sigmund Card game automation framework Hooks game and lo ...

  6. 一、Vue基础之常用方法

    一.JSON.parse() 与 JSON.stringify() 1.JSON.parse() :是从一个字符串中解析出 json 对象 //定义一个字符串 var data='{"nam ...

  7. 转: Android 设备的远程调试入门

    从 Windows.Mac 或 Linux 计算机远程调试 Android 设备上的实时内容. 本教程将向您展示如何: 设置您的 Android 设备进行远程调试,并从开发计算机上发现设备. 从您的开 ...

  8. python programming作业10(仍有一点点小bug)

    # -*- coding: utf-8 -*- import os import platform import sys from PyQt5.QtCore import * from PyQt5.Q ...

  9. delphi中and和or的特殊用法

    1=1 10=2 100=4 1000=8 1 or 2 = 3(11); 1 and 3 = 1; 2 and 3 = 2; 2 or 4 = 6(110); 2 and 6 = 2; 4 and ...

  10. 一个好的关于计算文件大小,及使其便于阅读的方法(php)

    public function getReadableFileSize($retstring=null){ $sizes = array('byte','kB','MB','GB','TB','PB' ...