zoukankan      html  css  js  c++  java
  • Go map相关

    map

       Go语言中的map是一种无序的,基于key-value的数据解构,在Go语言中map是引用类型,因此必须初始化后才能使用。

       以下示例将展示如何声明一个map类型,以及如何简单使用。

       需要注意的是mapcap可以进行自动扩容,但是我们应该在初始化map的时候就给好适当的容量以提高性能。

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	// 初始化一个map,key为string类型,value为int类型,容量为10组
    	var m = make(map[string]int,10)
    	// 进行填充数据
    	m["first"] = 110
    	m["second"] = 120
    	m["last"] = 119
    	// 取出value
    	fmt.Println(m["first"]) // 110
    }
    

    声明填充

       在声明map时我们就可以对其填充一些数据,这在很多编程语言中都是被允许的,Go语言中也不例外。

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	// 注意,不可指定cap
        var userInfo = map[string]string{
    		"userName":"云崖先生",
    		"userAge":"18",
    		"userGender":"male",
    	}
    	fmt.Println(userInfo)
    	// map[userAge:18 userGender:male userName:云崖先生]
    }
    

    判断key

       Go语言中有个判断map中键是否存在的特殊写法,格式如下:

    value, ok := map[key]
    

       示例如下:

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	// 注意,不可指定cap
        var userInfo = map[string]string{
    		"userName":"云崖先生",
    		"userAge":"18",
    		"userGender":"male",
    	}
    	value,ok := userInfo["userHobby"]
    	if ok{
    		fmt.Println(value)
    	}else{
    		fmt.Println("没有该key")
    	}
    
    	fmt.Printf("%v 
    ",value) //  一堆空格
    	fmt.Printf("%v 
    ",ok) // false
    	
    }
    

    遍历map

       遍历map时应该使用range进行遍历,另外由于map中的数据是无序的,所以遍历的时候也是无序的。

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	// 注意,不可指定cap
        var userInfo = map[string]string{
    		"userName":"云崖先生",
    		"userAge":"18",
    		"userGender":"male",
    	}
    	for key,value := range userInfo{
    		fmt.Printf("%v-%v 
    ",key,value)
    	}
    }
    

       当只想遍历key时,可不指定value

    顺序遍历

       由于map是无序的,所以如果我们想使用顺序遍历,则需要将key全部提取到一个slice中,遍历slice取出map中的value即可。

    package main
    
    import(
    	"fmt"
    	"sort"
    )
    
    func main() {
    	m := map[string]string{
    		"k-2": "第二个",
    		"k-5": "第五个",
    		"k-1": "第一个",
    		"k-4": "第四个",
    		"k-3": "第三个",
    	}
    	slice := make([]string,0,5) // 只能用切片,切片才能append
    	for key := range(m){
    		slice = append(slice,key)
    	}
    	sort.Strings(slice) // 排序
    	for _,key := range(slice){
    		fmt.Println(m[key])
    	}
    }
    
    

    删除元素

       使用内建函数delete()可删除map中的键值对。

    delete(map,key)
    

       示例演示:

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	// 注意,不可指定cap
        var userInfo = map[string]string{
    		"userName":"云崖先生",
    		"userAge":"18",
    		"userGender":"male",
    	}
    	delete(userInfo,"userGender")
    	fmt.Println(userInfo)
    	// map[userAge:18 userName:云崖先生]
    }
    
    

    切片的元素是map

       切片中的元素可以是map

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	m := map[string]string{
    		"k-2": "第二个",
    		"k-5": "第五个",
    		"k-1": "第一个",
    		"k-4": "第四个",
    		"k-3": "第三个",
    	}
    	slice := make([]map[string]string, 0, 1) // 该切片内部只能存储map
    	slice = append(slice, m)
    	fmt.Println(slice[0]["k-1"])
    	fmt.Println(slice[0]["k-2"])
    }
    

    map的value是切片

       一个切片也可以作为mapvalue

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	// 该map的value必须是slice
    	var sliceMap = make(map[string][]string, 3)
    	var sliceValue = make([]string, 0, 3)
    	sliceValue = append(sliceValue,"slice-1","slice-2","slice-3")
    	sliceMap["first"] = sliceValue
    	fmt.Println(sliceMap)
    	// map[first:[slice-1 slice-2 slice-3]]
    }
    
  • 相关阅读:
    faster rcnn学习(三)
    too many values to unpack (expected 2)
    RuntimeWarning: overflow encountered in ubyte_scalars
    C#中excel读取和写入
    C#中使用Sql对Excel条件查询
    IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法IIS上部署MVC网站,打开后500错误
    C#微信公众平台账号开发,从零到整,步骤详细。
    VS快捷键大全
    ASP.NET将文件写到另一服务器
    开放api接口签名验证
  • 原文地址:https://www.cnblogs.com/Yunya-Cnblogs/p/13758215.html
Copyright © 2011-2022 走看看