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))
}
 
 
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))
}
 
 
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))
}
 
 
- 通过 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])
}
 
 
 
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)
}
 
 
- 删除 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)
}
 
 
 
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)
}
 
 
 
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)
	}
}
 
 
- 使用 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)
}
 
 
起始