【Go语言】map类型

181 阅读7分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情

map类型初始化分析

1. 结构:

map[KeyType]ValueType

释义:Key:表示键的类型,数据类型通常为int、string类型。Value:表示键对应的值的类型,数据类型通常为数字(整数、浮点数)、string、map、struct。

结构释义:

(map)映射是基于键来存储值。映射的优势是能够基于键快速索引数据。键就像索引一样,指向与该键关联的值,在内存中键值对的关系如下图所示:

img

结构分解: img

解析:map是一种无序的基于key-value的数据结构,用于存储一系列无序的键值对。Go语言中的map是引用类型,必须初始化才能使用。map即是映射。

2. 举例:通过映射来实现部分字符串的输出。

 package main                                                     //包的声明
 import "fmt"                                                      //引入包
 func main() {                                                      //函数
    // TODO 创建一个键为字符串类型,值为字符串类型的map
    map1 := map[string]string{                                     //map的初始化
       "name":    "北京知链",
       "address": "北京市海淀区上地七街得实大厦",
    }
    // 获取map中的元素
    fmt.Println(map1["name"])    // 北京知链                      //语句&表达式输出
    fmt.Println(map1["address"]) // 北京市海淀区上地七街得实大厦
 }

终端输出:

img

结构解析:

 package main                                               //包的声明

包声明:package main 定义了包名。它在源文件中指明了这个文件属于那个包。

 import "fmt"                                                      //引入包

引入包: import ("fmt""time") 告诉 Go 编译器这个程序需要使用 fmt 包和time包,fmt 包实现了格式化 IO(输入/输出)的函数。

 func main() {                                                        //函数

函数:func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。函数执行开始后,函数内语句依照main()函数内依次执行。

  // TODO 创建一个键为字符串类型,值为字符串类型的map
    map1 := map[string]string{                                     //map的初始化
       "name":    "北京知链",
       "address": "北京市海淀区上地七街得实大厦",
    }      

map* 的初始化:* Go语言是静态类型语言,因此map(映射)也是有明确类型的。编译器会检查函数调用中map的数据类型的正确性。在此语句中通过短类型声明:=map声明并指定出map类型然后通过=(赋值运算符)将数据赋值给索引下的键值(即数据存储空间)。(map)映射是基于键来存储值。映射的优势是能够基于键快速索引数据。键就像索引一样,指向与该键关联的值

  // 获取map中的元素
    fmt.Println(map1["name"])    // 北京知链                      //语句&表达式输出
    fmt.Println(map1["address"]) // 北京市海淀区上地七街得实大厦

语句&表达式输出:fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。函数内语句依照main函数内依次执行。需要注意的是,在输出是通过指定map中的键值对能直接输出该元素的数据值。

map的删除分析

1. 结构:

delete(变量名,key值)

结构分解:

解析: 在 Golang 中的 map 结构,在删除键值对的时候,并不会真正的删除,而是标记。通过delete 删除指定key的元素,delete 操作没有真正释放内存。大量删除键值时会造成OOM(内存溢出)。

2. 举例: 在切片中删除一个指定元素。

 map2 := make(map[int]string)                 // map声明 
 map2[1] = "知链"                              // map元素赋值
 map2[2] = "区块链"
 delete(map2, 1)                                // map元素删除
 fmt.Println(map2)                               //语句&表达式输出

终端输出: img

结构解析:

 map2 := make(map[int]string)                 // map声明 

map* 的声明:* Go语言是静态类型语言,因此map(映射)也是有明确类型的。编译器会检查函数调用中map的数据类型的正确性。(map)映射是基于键来存储值。映射的优势是能够基于键快速索引数据。键就像索引一样,指向与该键关联的值。

map2[1] = "知链"                              // map元素赋值
map2[2] = "区块链"                      

map* 元素赋值:* Go语言是静态类型语言,在此语句中通过=(赋值运算符)将数据赋值给索引下的键值(即数据存储空间)并以指定索引来指定相应元素数据。(map)映射是基于键来存储值。映射的优势是能够基于键快速索引数据。键就像索引一样,指向与该键关联的值。

delete(map2, 1)                                // map元素删除

map* 元素删除:* 在 Golang 中的 map 结构,在删除键值对的时候,并不会真正的删除,而是标记。通过delete 删除指定key的元素,在此语句中通过指定键值对数据以索引找寻对应值进行修改操作。

fmt.Println(map2)                               //语句&表达式输出

语句&表达式输出:fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。函数内语句依照main函数内依次执行。需要注意的是,在输出是通过指定map中的键值对也能直接输出该元素的数据值。

map的循环分析

map的循环分析

1. 结构:

for index, value := range 变量名{

...

}

释义:第一个返回值 index是数组或者切片的索引,第二个是在该索引位置的值;他们都是仅在 for 循环内部可见的局部变量。value 只是 map某个索引位置的值的一个拷贝,不能用来修改 map 该索引位置的值。

结构分解:img

解析:map是一种无序的key-value数据结构,使用for-range语句就可以遍历。当需要按序打印输出,可以把map中的对应数据拷贝到切片里,使用sort包里的排序函数进行排序。sort.Ints:对整数进行排序,sort.Strings:对字符串进行排序,sort.Float64s:对浮点数进行排序。

2. 举例:请通过go语言输出一个map循环。

//TODO 使用内置的 make 函数来创建
map2 := make(map[int]string)                         // map的声明
map2[0] = "华为"                                     // map元素赋值   
map2[1] = "知链"
map2[2] = "百度"
map2[3] = "腾讯"
map2[4] = "阿里"

// TODO map循环
for key, value := range map2 {                              // for range循环             
   fmt.Println(key, value)
}

终端输出: img

结构解析:

//TODO 使用内置的 make 函数来创建
map2 := make(map[int]string)                         // map的声明

map* 的声明:* Go语言是静态类型语言,因此map(映射)也是有明确类型的。编译器会检查函数调用中map的数据类型的正确性。(map)映射是基于键来存储值。映射的优势是能够基于键快速索引数据。键就像索引一样,指向与该键关联的值。

map2[0] = "华为"                                     // map元素赋值   
map2[1] = "知链"
map2[2] = "百度"
map2[3] = "腾讯"
map2[4] = "阿里"

map* 元素赋值:* Go语言是静态类型语言,在此语句中通过=(赋值运算符)将数据赋值给索引下的键值(即数据存储空间)并以指定索引来指定相应元素数据。(map)映射是基于键来存储值。映射的优势是能够基于键快速索引数据。键就像索引一样,指向与该键关联的值。

// TODO map循环
for key, value := range map2 {                              // for range循环             
   fmt.Println(key, value)
}

for range* 循环:for range 结构是Go语言特有的一种的迭代结构,在许多情况下都非常有用,for range 可以遍历数组、切片、字符串、map 及通道(channel)。 在for range 循环打印的过程中依次将数组map2中的元素依据下标索引依次打印输出元素内存所储存的数据。*