zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", 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
    ", 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
    ", 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
    
  • 相关阅读:
    vue 之 vuex
    vue中this.$router.push() 传参
    ES6新特性
    css优先级
    创建第一个vue工程
    对Vue.js的认知
    前端的认知与见解
    Web前端常见问题
    数据库如何进行索引优化
    Python FAQ
  • 原文地址:https://www.cnblogs.com/haima/p/11708537.html
Copyright © 2011-2022 走看看