zoukankan      html  css  js  c++  java
  • Title

    Go的map

    map

    map为映射关系容器,内部为散列表(hash)实现

    map是引用类型,必须初始化

    make(map[KeyType]ValueType, [cap])
    

    map类型的变量默认初始值为nil,需要使用make()函数来分配内存

    cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量

    func main() {
      scoreMap := make(map[string]int, 8)
      scoreMap["张三"] = 90
      scoreMap["李四"] = 91
      fmt.Println(scoreMap)
      fmt.Println(scoreMap["李四"])
      fmt.Printf("type of scoreMap: %T
    ", scoreMap)
    }
    // map[李四:91 张三:90]
    // 91
    // type of scoreMap: map[string]int
    

    声明时填充元素

    func main() {
      userInfo := map[string]string{
        "username": "james",
        "pwd": "66732",
      }
      fmt.Println(userInfo)
    }
    // map[username:james pwd:66732]
    

    go判断map中键是否存在

    func main() {
      userInfo := map[string]string{
        "username": "james",
        "pwd": "66732",
      }
      // v为对应的value,不存在时为key对应的零值,state为true或false
      v, state := userInfo["username"]
      if state {
        fmt.Println(v)
      } else {
        fmt.Println("没有该键")
      }
    }
    

    go中map的遍历

    Go语言中使用for range遍历map

    func main() {
      userInfo := map[string]string{
        "username": "james",
        "pwd": "66732",
      }
      for k, v := range userInfo {
        fmt.Println(k, v)
      }
    }
    // username james
    // pwd 66732
    

    只遍历key时

    func main() {
      userInfo := map[string]string{
        "username": "james",
        "pwd": "66732",
      }
      for k := range userInfo {
        fmt.Println(k)
      }
    }
    // username
    // pwd
    

    注意: 遍历map时的元素顺序与添加键值对的顺序无关

    go删除map中的键值对

    使用delete()内建函数从map中删除一组键值对

    delete(map, key)
    
    func main() {
      userInfo := map[string]string{
        "username": "james",
        "pwd": "66732",
      }
      delete(userInfo, "pwd")
      for k, v := range userInfo {
        fmt.Println(k, v)
      }
    }
    // username james
    

    go按照指定顺序遍历map

    import (
    	"fmt"
    	"math/rand"
    	"sort"
    	"time"
    )
    
    func main() {
    	rand.Seed(time.Now().UnixNano()) // 初始化随机数种子
    	var scoreMap = make(map[string]int, 20)
    
    	for i := 0; i < 10; i++ {
    		key := fmt.Sprintf("stu%02d", i) // 生成stu开头的字符串
    		value := rand.Intn(100)          // 生成0到99的随机数
    		scoreMap[key] = value
    	}
    	fmt.Println(scoreMap)
    	
    	// 取出map中所有的key存入keys
    	keys := make([]string, 0, 20)
    	for key := range scoreMap {
    		keys = append(keys, key)
    	}
    
    	// 对切片keys进行排序
    	sort.Strings(keys)
    
    	//按照排序后的keys遍历map
    	for _, key := range keys {
    		fmt.Println(key, scoreMap[key])
    	}
    }
    // map[stu04:16 stu08:1 stu09:36 stu01:51 stu02:32 stu05:47 stu07:14 stu06:97 stu00:22 stu03:77]
    // stu00 22
    // stu01 51
    // stu02 32
    // stu03 77
    // stu04 16
    // stu05 47
    // stu06 97
    // stu07 14
    // stu08 1
    // stu09 36
    

    元素为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")
      // 对切片中元素初始化
      mapSlice[0] = make(map[string]string, 5)
      mapSlice[0]["name"] = "james"
      mapSlice[0]["age"] = "25"
      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[name:james age:25] 
    // index:1, value:map[] 
    // index:2, value:map[] 
    

    值为切片类型的map

    func main() {
      var sliceMap = make(map[string][]string, 3)
      fmt.Println(sliceMap)
      fmt.Println("after init")
      key := "china"
      value, state := sliceMap[key]
      if !state {
        value = make([]string, 0, 2)
      }
      value = append(value, "北京", "上海")
      sliceMap[key] = value
      fmt.Pringln(sliceMap)
    }
    // map[]
    // after init
    // map[china:[北京 上海]]
    

    统计单词出现次数

    package main
    
    import (
    	"fmt"
    	"strings"
    )
    
    func main() {
    	msg := "how do you do"
    	splits := strings.Split(msg, " ")
    	ret := make(map[string]int, 8)
    	for _, v := range splits {
    		ret[v] = ret[v] + 1
    	}
    	fmt.Println(ret)
    }
    // map[how:1 do:2 you:1]
    
  • 相关阅读:
    Delphi以及三方控件的源代码规模
    InitInheritedComponent的执行过程
    poj 3897 Maze Stretching 二分+A*搜索
    一些窗口API函数,比如SetForegroundWindow,SwitchToThisWindow
    终于懂了:WM_PAINT 与 WM_ERASEBKGND(三种情况:用户操作,UpdateWindow,InvalidateRect产生的效果并不相同),并且用Delphi代码验证 good
    窗口绘制有关的消息整理 WM_PAINT, WM_NCPAINT, WM_ERASEBKGND
    WM_PAINT与WM_ERASEBKGND(用户操作和API这两种情况产生消息的顺序有所不同)
    关于WM_ERASEBKGND和WM_PAINT的深刻理解
    offsetHeight在OnLoad中为0的现象
    TWinControl.WMNCPaint对非客户的绘制
  • 原文地址:https://www.cnblogs.com/guotianbao/p/12114741.html
Copyright © 2011-2022 走看看