// xuhh_go_map project
/*
1.map的特点:
a.map是go语言的内置引用类型,所以多个map指向同一个底层的情况下,一个值发生变化,全部发生变化
b.map是无序的,每次迭代的顺序都是不确定的。
c.map只有 len 没有 cap。
d.map不是线程安全的,在多个go-routine中使用的时候,要加锁。
e.map[key]value
key 必须支持 运算符(== 、!= )的操作,例如 number/string/pointer/array/struct/interface
value 可以是任意类型。
2.map的创建:
a. new 进行创建
mapA := new(map[int]string)
*mapA = map[int]string{}
(*mapA)[112] = "112"
(*mapA)[110] = "110"
b.直接声明创建
var map1 map[int]string = map[int]string{}
map2 := map[int]string{
11: "11",
12: "12",
13: "13",
}
c.make进行创建
map3 := make(map[int]string, 1000) // 1000 是map的容量 ,这点和slice是一样的,预先申请一块内存,避免以后频繁扩张,提升性能
3.map 的一些基本操作
a.判断键值是否存在
if v, ok := map1[5]; ok == true {
fmt.Println("this key is exit ", v)
} else {
fmt.Println("this key is not exit ")
}
b.增加
map[key] = value
c.修改
map 在修改value的时候
如果value是值类型,要想改变值,需要全部替换(value 换 value)
如果是引用类型,则可以直接赋值替换
mapS := map[string]PERSON{}
mapS["xuhh"] = PERSON{name: "xuhh", old: 26}
mapS["xuhh"].name = "xuhehe" // error cannot assign to mapS["xuhh"].name
d.删除
可以在迭代的时候安全删除键值对
delete(map, key)
e.迭代遍历
for k, v := range map {
fmt.Println("key = ", k, "value = ", v)
}
*/package main import ( "fmt" ) type PERSON struct { name string old int } func main() { //new 进行创建 mapA := new(map[int]string) *mapA = map[int]string{} (*mapA)[112] = "112" (*mapA)[110] = "110" for v := range *mapA { fmt.Println(v) } //直接创建,可以直接初始化: var map1 map[int]string = map[int]string{} map2 := map[int]string{ 11: "11", 12: "12", 13: "13", } fmt.Println(map2) map1[2] = "222" map1[3] = "333" map1[1] = "111" map1[6] = "666" map1[8] = "888" map1[5] = "555" fmt.Println(map1) // make 创建 map3 := make(map[int]string, 1000) map3[22] = "22" fmt.Println(map3) // map 的操作 // 查找 if v, ok := map1[5]; ok == true { fmt.Println("this key is exit ", v) } else { fmt.Println("this key is not exit ") } //add map1[5] = "exit" fmt.Println(map1[5]) //modify mapS := map[string]PERSON{} mapS["xuhh"] = PERSON{name: "xuhh", old: 26} //mapS["xuhh"].name = "xuhehe" // error cannot assign to mapS["xuhh"].name //map 在操作value 的时候,如果value 是 值类型 ,要想改变值,需要全部替换(value 换 value),如果不是引用类型,则可以直接赋值替换 //delete delete(map1, 5) if _, ok := map1[5]; !ok { fmt.Println("this key is deleted") } //迭代遍历 for k, v := range map1 { fmt.Println("key = ", k, "value = ", v) } }
有疑问加站长微信联系(非本文作者)