p24 map 之 golang基础

Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。

参考文档

https://www.liwenzhou.com/posts/Go/08_map/

package main

import "fmt"

func main() {
   //指针类型,只声明不会开辟内存地址
   var a map[string]string
   fmt.Println(a)        //map[]
   fmt.Println(a == nil) //true
   fmt.Printf("%p\n", a)   //0x0
   //a["name"]="wang" // 没有开辟内家空间不能赋值
   //fmt.Println(a)


   //使用make开辟内存地址
   var b  = make(map[string]string)
   fmt.Println(b)        //map[]
   fmt.Println(b == nil) //false
   fmt.Printf("%p\n", b)   //0xc000064390
   b["name"] = "wang"
   fmt.Println(b) //map[name:wang]

   //声明时直接赋值 写在一行
   var c = map[string]string{"name":"lisi"} //map[name:lisi]
   fmt.Println(c)

   //声明时直接赋值 分行写
   var d = map[string]string{
      "name":"wangwu",
   }
   fmt.Println(d)  //map[name:wangwu]

   //key不存在时,会新增单元
   d["age"] =  "18"
   fmt.Println(d) //map[age:18 name:wangwu]

   //key存在时会更新单元里的值
   d["age"] = "19"
   fmt.Println(d) //map[age:19 name:wangwu]

   //删除 删除时有key就会删除,没有时也不会报错
   delete(d,"age") //map[name:wangwu]
   fmt.Println(d)

   //取key对应的v key存在返回对应的值, key不存在返回类型对应的默认值
   fmt.Println(d["name"]) //wangwu


   //key存在时返回对应值 第二返回值参数 ok表示key存不存在 bool
   v,ok :=d["name"]
   fmt.Println(v,ok) //wangwu true
   //key不存在时返回对应的默认值 "" false
   v2,ok2 :=d["age"]
   fmt.Println(v2,ok2) //"" false

    //循环
    scoreMap := make(map[string]int)
    scoreMap["张三"] = 90
    scoreMap["小明"] = 100
    scoreMap["娜扎"] = 60
    //循环 遍历k,v
    for k,v :=range scoreMap{
       fmt.Println(k,v)
    }
    //只遍历k
    for k := range scoreMap {
       fmt.Println(k)
    }
    //只遍历v
    for _,v:=range scoreMap{
       fmt.Println(v)
    }
}

按照指定顺序遍历map

func main() {
	rand.Seed(time.Now().UnixNano()) //初始化随机数种子

    var scoreMap2 = make(map[string]int, 10)
    
    for i := 0; i < 10; i++ {
       key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串
       value := rand.Intn(10)          //生成0~99的随机整数
       scoreMap2[key] = value
    }
    //取出map中的所有key存入切片keys
    var keys = make([]string, 0, 20)
    for key := range scoreMap2 {
       keys = append(keys, key)
    }
    //对切片进行排序
    sort.Strings(keys)
    //按照排序后的key遍历map
    for _, key := range keys {
       fmt.Println(key, scoreMap2[key])
    }
}
打印结果:
stu00 2
stu01 5
stu02 6
stu03 6
stu04 1
stu05 2
stu06 8
stu07 8
stu08 0
stu09 4

元素为map类型的切片

下面的代码演示了切片中的元素为map类型时的操作:

func main()  {
    var mapSlice = make([]map[string]string, 3)
    for index, value := range mapSlice {
       fmt.Printf("index:%d value:%v\n", index, value)
    }
    fmt.Println("after init")
    // 对切片中的map元素进行初始化
    mapSlice[0] = make(map[string]string, 10)
    mapSlice[0]["name"] = "小王子"
    mapSlice[0]["password"] = "123456"
    mapSlice[0]["address"] = "沙河"
    for index, value := range mapSlice {
       fmt.Printf("index:%d value:%v\n", index, value)
    }
}
打印结果:
index:0 value:map[]
index:1 value:map[]
index:2 value:map[]
after init
index:0 value:map[address:沙河 name:小王子 password:123456]
index:1 value:map[]
index:2 value:map[]

值为切片类型的map

下面的代码演示了map中值为切片类型的操作:

func main()  {
   //map映射
   //只完成了map的初使化
   var mapslice = make(map[string][]int,8)
   v,ok := mapslice["china"]
   if ok {
      fmt.Println(v)
   }
   mapslice["china"] =make([]int,8) //完成切片的初使化
   mapslice["china"][0] = 100
   mapslice["china"][1] = 200
   mapslice["china"][3] = 300
   fmt.Println(mapslice)
   for k,v:=range mapslice {
      fmt.Println(k,v)
   }
}

打印效果:

map[china:[100 200 0 300 0 0 0 0]]
china [100 200 0 300 0 0 0 0]

练习题

写一个程序,统计一个字符串中每个单词出现的次数。比如:”how do you do”中how=1 do=2 you=1

func test2(){
func test2(){
	var s = "how do you do"
	var wordmap = make(map[string]int,10)
	var words = strings.Split(s," ")
	fmt.Println(words) //[how do you do]
	for _,word:=range words {
		v,ok := wordmap[word]
		fmt.Println(v,ok)
		if ok {
			wordmap[word] = v + 1
		}else{
			wordmap[word] = 1
		}

	}

	for k,v :=range wordmap  {
		fmt.Println(k,v)
	}
}
打印结果:
[how do you do]
0 false
0 false
0 false
1 true
do 2
how 1
you 1
posted @ 2019-10-20 18:48  HaimaBlog  阅读(202)  评论(0编辑  收藏  举报