Go语言基础
介绍
基础
介绍
- 本文介绍Go语言中map(映射)(map声明、map初始化、map基础操作)等相关知识。
基础
map(映射)
- map 是无序的、存储键值对(key/value)形式,类似其它语言中的字典或散列表。
- 通过 key 来对 value 进行操作(增、删、改、查)。
- map 的 key 一般为基础数据类型,函数、map、切片及包含这三种的自定义结构体类型不能作为 key,自定义类型也可以作为key,value 可以为任意类型。
- map的底层实现是hash table,根据 key 查找 value 的时间复杂度是O(1)。
map声明
- 需要指定 key 和 value 的类型,
- 声明后 map 会自动初始化为 nil,表示此映射不存在
- cap()函数不能用于 map
package main
import (
"fmt"
"reflect"
)
func main() {
// map 声明,未初始化时,默认为 nil,映射不存在
var mp1 map[int]int
fmt.Println("mp1: ", mp1, ", mp1 == nil: ", mp1 == nil, ", type: ", reflect.TypeOf(mp1))
}
输出结果
mp1: map[] , mp1 == nil: true , type: map[int]int
map声明、map初始化
- map初始化方式具体如下
package main
import "fmt"
func main() {
// 使用字面量初始化
mp1 := map[int]int{1: 10, 2: 20, 3: 30}
fmt.Printf("mp1 type: %T, value: %v, len: %v\n", mp1, mp1, len(mp1))
mp2 := map[[2]int]int{}
fmt.Printf("mp2 type: %T, value: %v, len: %v\n", mp2, mp2, len(mp2))
// 不允许使用切片等引用数据类型作为 key
// mp3 := map[[]int]int{}
// 使用 make 创建 map
mp4 := make(map[int]int)
fmt.Printf("mp4 type: %T, value: %v, len: %v\n", mp4, mp4, len(mp4))
// 使用 make 创建 map,指定其长度
mp5 := make(map[int]int, 3)
fmt.Printf("mp5 type: %T, value: %v, len: %v\n", mp5, mp5, len(mp5))
}
输出结果
mp1 type: map[int]int, value: map[1:10 2:20 3:30], len: 3
mp2 type: map[[2]int]int, value: map[], len: 0
mp4 type: map[int]int, value: map[], len: 0
mp5 type: map[int]int, value: map[], len: 0
map基础操作
- 获取 map 中元素的数量
package main
import "fmt"
func main() {
// 获取元素数量,使用 len 函数
mp := map[int]int{1: 10, 2: 20, 3: 30}
fmt.Println("mp : ", mp)
fmt.Println("mp len: ", len(mp))
}
输出结果
mp : map[1:10 2:20 3:30]
mp len: 3
- 通过 key 访问 map 元素,当 key 不存在时,返回 value 类型的默认初始值
package main
import "fmt"
func main() {
// 访问 map 元素
mp := map[int]int{1: 10, 2: 20, 3: 30}
fmt.Println("mp[1] : ", mp[1])
fmt.Println("mp[2] : ", mp[2])
fmt.Println("mp[3] : ", mp[3])
// key 4 不存在
fmt.Println("mp[4] : ", mp[4])
}
输出结果
mp[1] : 10
mp[2] : 20
mp[3] : 30
mp[4] : 0
- 修改、增加 map 中的元素,两者操作方式相同
package main
import "fmt"
func main() {
mp := map[int]int{1: 10, 2: 20, 3: 30}
fmt.Println("mp : ", mp)
// 修改 map 中元素
mp[1] = 100
mp[3] = 300
fmt.Println("mp : ", mp)
// 增加 map 中的元素
mp[5] = 100
mp[7] = 300
mp[9] = 900
fmt.Println("mp : ", mp)
}
输出结果
mp : map[1:10 2:20 3:30]
mp : map[1:100 2:20 3:300]
mp : map[1:100 2:20 3:300 5:100 7:300 9:900]
- 删除 map 中的元素,通过 key ,使用 delete 函数
package main
import "fmt"
func main() {
mp := map[int]int{1: 10, 2: 20, 3: 30}
fmt.Println("mp : ", mp)
// 删除 map 中元素
delete(mp, 1)
fmt.Println("mp : ", mp)
// 清空 map
clear(mp)
fmt.Println("mp clear: ", mp)
// 指向 nil,由垃圾机制自动回收
mp2 := map[int]int{1: 10, 2: 20, 3: 30}
mp2 = nil
fmt.Println("mp nil: ", mp2)
mp3 := map[int]int{1: 10, 2: 20, 3: 30}
mp4 := mp3
fmt.Println("mp3: ", mp3)
fmt.Println("mp4: ", mp4)
delete(mp3, 1)
fmt.Println("mp3: ", mp3)
fmt.Println("mp4: ", mp4)
}
输出结果
mp : map[1:10 2:20 3:30]
mp : map[2:20 3:30]
mp clear: map[]
mp nil: map[]
mp3: map[1:10 2:20 3:30]
mp4: map[1:10 2:20 3:30]
mp3: map[2:20 3:30]
mp4: map[2:20 3:30]
- map 查询
package main
import "fmt"
func main() {
mp2 := map[int]string{1: "10", 2: "20", 3: "30"}
// map 查询,key 不存在
a, b := mp2[4]
fmt.Printf("a: %v, b: %v\n", a, b)
// map 查询,key 存在
c, d := mp2[3]
fmt.Printf("c: %v, d: %v\n", c, d)
}
输出结果
a: , b: false
c: 30, d: true
- map 元素遍历
package main
import "fmt"
func main() {
mp := map[int]int{1: 10, 2: 20, 3: 30}
// 使用 for-range 遍历 map
for i, v := range mp {
fmt.Printf("mp[%v] = %v\t", i, v)
}
}
输出结果
mp[1] = 10 mp[2] = 20 mp[3] = 30
- 使用 map 赋值给一个 map 变量,底层元素共享
package main
import "fmt"
func main() {
// 使用 map 赋值给一个 map 变量
mp3 := map[int]int{1: 10, 2: 20, 3: 30}
mp4 := mp3
fmt.Println("mp3: ", mp3)
fmt.Println("mp4: ", mp4)
delete(mp3, 1)
fmt.Println("mp3: ", mp3)
fmt.Println("mp4: ", mp4)
mp4[10] = 100
fmt.Println("mp3: ", mp3)
fmt.Println("mp4: ", mp4)
fmt.Println("mp3: ", mp3)
fmt.Println("mp4: ", mp4)
clear(mp4)
fmt.Println("mp3: ", mp3)
fmt.Println("mp4: ", mp4)
}
输出结果
mp3: map[1:10 2:20 3:30]
mp4: map[1:10 2:20 3:30]
mp3: map[2:20 3:30]
mp4: map[2:20 3:30]
mp3: map[2:20 3:30 10:100]
mp4: map[2:20 3:30 10:100]
mp3: map[2:20 3:30 10:100]
mp4: map[2:20 3:30 10:100]
mp3: map[]
mp4: map[]