map
- 类似其他语言中的哈希表或者字典,以key-value形式存储数据
- key必须是支持==或!=比较运算的类型,不可以是函数、map或slice
- map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍
- map使用make()创建,支持:=这种简写方式
package main
import (
"fmt"
)
func main() {
var m map[int]string //使用var关键字,[key类型]value类型
m = map[int]string{} //初始化这个map
//m = make(map[int]string)
m2 := make(map[int]string) //这样都是实现map的简单初始化的方法
fmt.Println(m)
fmt.Println(m2)
}
package main
import (
"fmt"
)
func main() {
m2 := make(map[int]string)
m2[1] = "ok"
fmt.Println(m2)
delete(m2, 1) //删除一个键值对
a := m2[1] //取出key为1的值
fmt.Println(a)
}
package main
import (
"fmt"
)
func main() {
var m map[int]map[int]string
m = make(map[int]map[int]string) //对m进行初始化
m[1] = make(map[int]string) //此时对key为1的map进行初始化
m[1][1] = "ok" //对key为1的map中的key为1的string进行赋值为ok
a := m[1][1] //取值
fmt.Println(a)
}
package main
import (
"fmt"
)
func main() {
var m map[int]map[int]string
m = make(map[int]map[int]string) //对m进行初始化
a, ok := m[2][1] //此时没有对key为2的map进行初始化,所以ok的返回值是false,a的值为空
fmt.Println(a, ok)
if !ok {
m[2] = make(map[int]string)
}
m[2][1] = "hello"
a, ok = m[2][1]
fmt.Println(a, ok)
}
- make([keyType]value Type, cap),cap表示容量,可省略
- 超出容量时会自动扩容,但尽量提供一个合理的初始值
- 使用len()获取元素个数
package main
import (
"fmt"
)
func main() {
// for i,v :range slice{} i对应的是slice的索引,v对应的是slice索引相对应的值这里对v的所有操作都不会影响这个slice
//这个时候需要用slice[i]来改变v的值
//for k,v :range map{} 此时k对应的是map中的key,v对应的是map中的value值,此时对k和v的操作都是对值得拷贝的操作,也需要map[k]来修改v的值
sm := make([]map[int]string, 5) //创建一个长度为5的map型的slice
for i, _ := range sm {
sm[i] = make(map[int]string, 1) //初始化sm当中的map
sm[i][10] = "ok"
fmt.Println(sm[i])
}
fmt.Println(sm)
}
- 键值对不存在时自动添加,使用delete()删除某键值对
- 使用for range 对map和slice进行迭代操作
package main
import (
"fmt"
"sort"
)
func main() {
m := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "e"}
s := make([]int, len(m))
i := 0
for k, _ := range m {
s[i] = k
i++
}
sort.Ints(s) //对map当中的k进行排序,这就是对map的间接排序
fmt.Println(s)
}
package main
import (
"fmt"
)
func main() {
m1 := map[int]string{1: "a", 2: "b", 3: "c"}
m2 := make(map[string]int)
fmt.Println(m2)
for k, v := range m1 {
m2[v] = k
}
fmt.Println(m2)
}