zoukankan      html  css  js  c++  java
  • Go map使用

    前言

    map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相应的键可以获取到值。

    在一个map里所有的键都是唯一的,而且必须是支持==和!=操作符的类型,切片、函数以及包含切片的结构类型由于具有引用语义,不能作为映射的键,使用这些类型会造成编译错误。
    map的value值可以是任意类型,没有限制。map里所有键的数据类型必须是相同的,值也必须如此,但键和值的数据类型可以不相同。
    注意:map是无序的,我们无法决定它的返回顺序,所以,每次打印结果的顺序有可能不同。

    创建与初始化

    package main
    
    import "fmt"
    
    func main() {
    
    	//初始化
    	//1.定义同时初始化
    	var m1 map[int]string  =map[int]string{1:"linlin",2:"sanye"}
    	fmt.Println(m1)
    
    	//2.自动推导类型
    	m2 := map[int]string{1:"linlin",2:"sanye"}
    	fmt.Println(m2)
    
    	//3.使用make创建
    	m3 :=make(map[int]string)
    	fmt.Println(m3)
    	//创建固定长度的map
    	m4 := make(map[int]string,10)
    	fmt.Println(m4)
    }
    

      

    访问与赋值

    package main
    
    import "fmt"
    
    func main() {
    
    	//初始化
    	m2 := map[int]string{1:"linlin",2:"sanye"}
    	fmt.Println(m2) //map[1:linlin 2:sanye]
    	m2[1] = "sanye"
    	m2[2] = "linlin"
    	fmt.Println(m2) //map[1:sanye 2:linlin]
    	fmt.Println(m2[1],m2[2])//sanye linlin
    }
    

      

    遍历

    Map的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。在实践中,遍历的顺序是随机的。每一次遍历都不相同。
    这是故意的,每次都使用随机的遍历顺序可以强制要求程序不会依赖具体的哈希函数实现。

    当使用 for range 遍历 map 时,不保证每次执行程序获取的元素顺序相同!!!

    package main
    
    import "fmt"
    
    func main() {
    
    	m3 := map[int]string{0:"linlin",1:"sanye",2:"timi",3:"meyi"}
    
    	for k,v := range m3{
    		fmt.Println("key:%d value:%s",k,v)
    	}
    
    	//判断map中key是否存在
    	if v,has :=m3[1];has{ //map[下标]
    		fmt.Println("value=",v,"has=",has)
    	} else{
    		fmt.Println("value=",v,"has=",has)
    	}
    
    }
    

      

    删除

    使用delete()函数,指定key值可以方便的删除map中的k-v映射。

    package main
    
    import "fmt"
    
    func mapDelete(m map[int]string,key int) map[int]string{
    	delete(m,key)
    	return m
    }
    
    func main() {
    
    	m3 := map[int]string{0:"linlin",1:"sanye",2:"timi",3:"meyi"}
    	fmt.Println(m3)//map[0:linlin 1:sanye 2:timi 3:meyi]
    	delete(m3,1) //删除key值为2的map
    	fmt.Println(m3)//map[0:linlin 2:timi 3:meyi]
    	mapDelete(m3,0)
    	fmt.Println(m3)//map[2:timi 3:meyi]
    
    }
    

      

    map为引用类型

    map 也是引用类型。当 map 被赋值为一个新变量的时候,它们指向同一个内部数据结构。因此,改变其中一个变量,就会影响到另一变量。

    package main
    import (
    	"fmt")
    func main() {
    	personSalary := map[string]int{
    		"steve": 12000,
    		"jamie": 15000,
    	}
    	personSalary["mike"] = 9000
    	fmt.Println("Original person salary", personSalary)
    	newPersonSalary := personSalary
    	newPersonSalary["mike"] = 18000
    	fmt.Println("Person salary changed", personSalary)
    }

    上面程序中的第 14 行,personSalary 被赋值给 newPersonSalary。下一行 ,newPersonSalary 中 mike 的薪资变成了 18000 。personSalary 中 Mike 的薪资也会变成 18000。程序输出:

    Original person salary map[steve:12000 jamie:15000 mike:9000]
    Person salary changed map[steve:12000 jamie:15000 mike:18000]

    当 map 作为函数参数传递时也会发生同样的情况。函数中对 map 的任何修改,对于外部的调用都是可见的。

    map的相等性与长度

    map相等性

    map 之间不能使用 == 操作符判断,== 只能用来检查 map 是否为 nil

    判断两个 map 是否相等的方法是遍历比较两个 map 中的每个元素。

    map长度

    package main
    import (
        "fmt")
    func main() {
        personSalary := map[string]int{
            "steve": 12000,
            "jamie": 15000,
        }
        personSalary["mike"] = 9000
        fmt.Println("length is", len(personSalary)) //结果为3
    }
  • 相关阅读:
    springcloud-Ribbon之手写轮询算法
    springcloud-Ribbon负载均衡规则的替换
    git本地库和远程库的连接和断开
    本地项目第一次提交到码云或github
    python基础语法练习
    Xss-labs-level11-15
    Vulnhub-靶机-ESCALATE_LINUX: 1
    Xss-labs-level7-10
    Vulnhub-靶机-DC: 6
    Jenkins入门之执行Powershell脚本
  • 原文地址:https://www.cnblogs.com/-wenli/p/11795436.html
Copyright © 2011-2022 走看看