58

Go map相关

 3 years ago
source link: http://www.cnblogs.com/Yunya-Cnblogs/p/13758215.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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 \n",value) //  一堆空格
	fmt.Printf("%v \n",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 \n",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]]
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK