zoukankan      html  css  js  c++  java
  • Golang map

    Golang map

    声明

    var map identifier [keytype]valuetype

    Java中的HashMap相似, 可以使用多种类型作为key,

    但是除slice, map, function

    注意: 声明是不会分类内存的, 初始化需要make, 分配内存后赋值使用

    • 相同的key, 会覆盖之前的值
    • key-value无序
    • len(map)获取mapsize
    • 如果通过map[key] 获取的值不存在返回 0

    使用

    方式一: make

    func main() {
    	var m map[string]string
    	m = make(map[string]string, 10)
    	m["张三"] = "sandy"
    	m["李四"] = "swagger"
    	m["王五"] = "woody"
    	fmt.Println(m)
    }
    

    方式二: 直接声明

    func main() {
    	//注意区别于数组arr := [...]string{0:"张三",1:"李四",2:"王五"}
    	m := map[string]string{
            "张三": "sandy",
            "李四": "swagger"}
    	m["王五"] = "woody"
    	fmt.Println(m)
    }
    

    特殊使用

    func main() {
    	//以map为value
    	m:= map[string]map[string]string{
    		"101" : {"name":"张三","gender":"1"},
    		"102" : {"name":"李四","gender":"1"},
    	}
    	print("----------------------------")
    	m = make(map[string]map[string]string)
    	//如果未在声明时赋值, 需要malloc一块空间
    	m["101"] = make(map[string]string)
    	m["101"]["name"] = "张三"
    	m["101"]["gender"] = "男"
    	m["102"] = make(map[string]string)
    	m["102"]["name"] = "李四"
    	m["102"]["gender"] = "男"
    }
    

    通用操作

    添加/C

    func main() {
    	m := map[int]string{}
    	m[1] = "张三"
    	fmt.Println(m)
    }
    

    查找/R

    func main() {
    	m := map[int]string{}
    	m[1] = "张三"
    	m[2] = "李四"
    	m[3] = "王五"
    	//通过key查找,val为对应key的value, flag为是否存在
    	val,flag := m[3]
    	fmt.Println(val)
    	fmt.Println(flag)
    }
    

    更新/U

    func main() {
    	m := map[int]string{}
    	m[1] = "张三"
    	m[2] = "李四"
    	//覆盖key为2的k-v
    	m[2] = "王五"
    	fmt.Println(m)
    }
    

    删除/D

    func main() {
    	m := map[int]string{}
    	m[1] = "张三"
    	m[2] = "李四"
    	m[3] = "王五"
    	fmt.Println(m)
    	//删除指定的key
    	delete(m, 2)
    	fmt.Println(m)
        //删除map,将指针指向一个新的地址, 原先的map被GC
    	m = make(map[int]string)
    }
    

    map遍历

    func traverse(m map[int]string){
    	for key, val := range m {
    		fmt.Println(key,val)
    	}
    }
    func main() {
    	m := map[int]string{}
    	m[1] = "张三"
    	m[2] = "李四"
    	m[3] = "王五"
    	traverse(m)
    }
    
    func main() {
    	//以map为value
    	m:= map[string]map[string]string{
    		"101" : {"name":"张三","gender":"1"},
    		"102" : {"name":"李四","gender":"1"},
    	}
    	for k1, nestedMap := range m {
    		for k2, val := range nestedMap {
    			fmt.Println(k1,k2,val)
    		}
    	}
    }
    

    map切片

    注意!!!切片是有序的

    func main() {
    	//初始了一个长度为1的切片
    	m := []map[string]string{
            {
    			"name": "丁一",
    		},
        }
    	//使用切片前必须初始化
    	m = make([]map[string]string, 5)
    	//初始化map
    	m[0] = make(map[string]string)
    	m[0]["name"] = "狗二"
    	//切片是有序的,append在切片的末尾添加
    	m = append(m, map[string]string{
    		"name": "张三",
    	})
    	fmt.Println(m)
    }
    
    

    map排序

    注意!!!, 新版的Golang, 如果key是数值类型按照从小到大排序, 如果是字符或是字符串按照字典序

    func main() {
    	//key如果是数字按照从小到达, 如果是字符串按照字典序排序
    	m := map[string]int{
    		"z":100,
    		"abc":  200,
    		"ab": 12,
    		"za":  399,
    		"ba":  231,
    	}
    	fmt.Println(m)
    }
    

    旧版

    func main() {
     
       m := map[int]int{
          1:  200,
          10: 12,
          4:  399,
          2:  231,
       }
       fmt.Println(m)
       var keys []int
       for key, _ := range m {
          keys = append(keys, key)
       }
       //将int slice按照从小到大排序
       sort.Ints(keys)
       fmt.Println(keys)
       for _, val := range keys {
          fmt.Println(val,m[val])
       }
    }
    
  • 相关阅读:
    【404】int main(int argc,char * argv[]) windows 下的使用
    【403】COMP9024 Exercise
    【402】Twitter Data Collection
    【401】Python 求合数的所有质数因子
    【400】numpy.pad 为数组加垫(迷宫类题目)
    iOS开发之指纹解锁
    iOS-响应链(Responder Chain)
    iOS上手指点击波纹效果的实现
    使用methodSignatureForSelector与forwardInvocation实现消息转发 (转)
    Objective-C中的@dynamic(转)
  • 原文地址:https://www.cnblogs.com/kikochz/p/13479350.html
Copyright © 2011-2022 走看看