您的位置:首页 > 编程语言 > Go语言

第5课 Go的map

2016-07-28 10:26 615 查看
package main

import (
"fmt"
)

/*
map
-类似其他语言中的哈希表或者字典,用key-value形式储存数据
-Key必须是支持==或者!=比较运算的类型,不可以是函数,map或者slice
-Map查找比线性搜索快ihenduo,但比使用索引访问数据的类型慢100倍
-Map使用make()创建,支持:=这种简写方式

-make([KeyType]valueType,cap),cap表示容量,可省略
-超出容量时会自动扩容,但尽量提供一个合理的初始值
-使用len()获取元素个数

-键值对不存在时自动添加,使用delete()删除某键值对
-使用for range对map和slice进行迭代操作
*/
func main() {
var m map[int]string
m = map[int]string{}
fmt.Println(m)
//完成了一个map的初始化

var n map[int]string
n = make(map[int]string)
fmt.Println(n)
//也可以用make来创建

p := make(map[int]string)
fmt.Println(p)
//也是可以的
fmt.Println("-----")

m[1] = "OK"
a := m[2]
fmt.Println(a) //输出空
fmt.Println(m[1])
delete(m, 1)      //删除
fmt.Println(m[1]) //删除后输出空
//简单map的操作
fmt.Println("-----")
}


package main

import (
"fmt"
)

func main() {
var m map[int]map[int]string     //这里创建了两层map
m = make(map[int]map[int]string) //这里只初始化了一层map

a, ok := m[2][1] //只有一个返回值的时候返回的是取到的值,第二个返回值返回是否键值对存在
if !ok {         //如果ok不存在,对map的第二层进行初始化
m[2] = make(map[int]string)
}
m[2][1] = "good"
a, ok = m[2][1]
fmt.Println(a, ok)
//复杂的map操作
}


slice 下的 for-range

package main

import (
"fmt"
)

func main() {
for i, v := range slice {
//返回slice相对应的索引,i相当于计数器,v相当于slice所存储的值,是拷贝,不会影响slice本身
//可以通过slice[i]对slice本身进行操作

}
}


map下的for-range

package main

import (
"fmt"
)

func main() {
for k, v := range map {
//返回k,v键值对(同样是拷贝)
//当然可以对m[k]直接对map进行操作
}
}


for-range为map初始化

package main

import (
"fmt"
)

func main() {
sm := make([]map[int]string, 5) //这是一个以map为元素的切片,初始化容量、元素为5
for _, v := range sm {
v = make(map[int]string, 1)
v[1] = "ok"
fmt.Println(v)
}
fmt.Println(sm)
/*
输出结果
map[1:ok]
map[1:ok]
map[1:ok]
map[1:ok]
map[1:ok]
[map[] map[] map[] map[] map[]]
显然v是拷贝的,无法对map本身进行操作
如果要对本身操作,需要做如下修改(利用i)
*/

smm := make([]map[int]string, 5)
for i := range sm {
smm[i] = make(map[int]string, 1)
smm[i][1] = "ok"
fmt.Println(smm[i])
}
fmt.Println(smm)
}


对map的间接排序

package main

import (
"fmt"
"sort"
)

func main() {
//对map的间接排序
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++
} //已经将map存入slice中
fmt.Println(s) //每次打印发现不同,体现map的无序性
sort.Ints(s)   //对slice排序
fmt.Println(s) //每次打印出来的是有序的

//我们只能实现对map的间接排序,因为map是无序的,我们只能提取后排序
fmt.Println(m)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: