go20/day02/map/main.go

136 lines
3.2 KiB
Go
Raw Normal View History

package main
import "fmt"
var (
globalMap = map[string]string{}
)
func main() {
personList := []Person{}
personList = append(personList, Person{
Name: "张三",
Age: 18,
})
personList = append(personList, Person{
Name: "李四",
Age: 20,
})
// 如何找到李四这个对象
for _, person := range personList {
if person.Name == "李四" {
// 找到了
fmt.Println("找到李四:", person)
break
}
}
// 如果我这个切切片非常大, 上百万, 上千万
// 通过切片查找一个元素, 效率非常低, O(n)
// 这时可以使用 map 来优化查找效率
// 使用map 来存储人员信息, key 是姓名, value 是 Person 对象
personMap := map[string]Person{}
personMap["张三"] = Person{
Name: "张三",
Age: 22,
}
personMap["李四"] = Person{
Name: "李四",
Age: 24,
}
fmt.Println("通过Map直接找到李四: ", personMap["李四"])
/*
1. 声明和初始化
map[keyType]valueType
keyType 必须是可以hash的类型 常见的可以是 string int float64 bool
*/
// 先声明,在初始化
var animalMap map[string]string
// animalMap = make(map[string]string)
// 初始化一个空的 map
animalMap = map[string]string{}
fmt.Println("animalMap:", animalMap)
// 声明的同时初始化(常用, 简短声明用不了的情况, 只能用 var 声明)
var cityMap = map[string]string{
"北京": "北京是中国的首都",
"上海": "上海是中国的经济中心",
"广州": "广州是中国的南大门",
}
fmt.Println("cityMap:", cityMap)
// 简短声明(最常用, 推荐)
cityMap1 := map[string]string{
"北京": "北京是中国的首都",
"上海": "上海是中国的经济中心",
"广州": "广州是中国的南大门",
}
fmt.Println("cityMap:", cityMap1)
/* * 2. 访问元素
value := map[key]
*/
fmt.Println("== 访问元素 ==")
beijingDesc := cityMap1["北京"]
fmt.Println("北京的描述是:", beijingDesc)
/* * 3. 删除元素
delete(map, key)
*/
delete(cityMap1, "广州")
fmt.Println("删除广州后 cityMap1:", cityMap1)
/* * 2. 增加/修改元素
map[key] = value
key 不存在就是新增key 存在就是修改
*/
cityMap1["深圳"] = "深圳是中国的科技创新中心"
fmt.Println("添加深圳后 cityMap1:", cityMap1)
/*
如何判断某个key是否存在
comok断言: value, ok := map[key]
常用场景: 有了后就不修改 没有才添加
*/
value, ok := cityMap1["上海"]
if ok {
fmt.Println("上海存在,描述是:", value)
} else {
fmt.Println("上海不存在")
}
/*
map的遍历
range iterage -> (k/indev/..., v)
for key, value := range map {
}
*/
fmt.Println("== map的遍历 ==")
for key, value := range cityMap1 {
fmt.Printf("%s 的描述是: %s\n", key, value)
}
// 通常只需要 key 的场景, 对象修改
for key := range cityMap1 {
fmt.Printf("%s 的描述是: %s\n", key, cityMap1[key])
}
/*
map 是一种引用类型, 默认值是 nil, 通过指针 指向数据(key value)c存储区(bucket)
*/
fmt.Println("== map 是引用类型 ==")
m1 := map[string]int{"a": 1}
m2 := m1 // 共享底层数据
m2["b"] = 2
fmt.Println(m1) // map[a:1 b:2] m1也被修改
fmt.Println(m2) // map[a:1 b:2]
}
type Person struct {
Name string
Age int
}