编程语言11、映射-GOLANG
xiu概念
数组和映射使用序列整数作为索引查找指定元素的方式在针对某些特定元素的时候查找数据比较麻烦,而映射采用键值对的的方式存储数据,利用键去寻找指定的元素,而键的类型可以试几乎所有的类型
声明映射
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package main
import "fmt"
func main() {
temperature := map[string]int{ "Earth": 15, "Mars": -65, } temp := temperature["Earth"] fmt.Println("地球表面温度为", temp, "度") temperature["Earth"] = 16 fmt.Println(temperature) Venus := temperature["Venus"] fmt.Println(Venus)
}
|
上面的写法可能会存在某些问题,比如我如何判断Venus真的存在于map中并且数值就是0,还是说不存在,map返回了零值,这种情况go语言提供了”逗号与ok”语法进行判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package main
import "fmt"
func main() {
temperature := map[string]int{ "Earth": 15, "Mars": -65, } temp := temperature["Earth"] fmt.Println("地球表面温度为", temp, "度") temperature["Earth"] = 16 fmt.Println(temperature) Venus := temperature["Venus"] fmt.Println(Venus) if Venus, t := temperature["Venus"]; t { fmt.Println("金星表面温度为", Venus, "度") } else { fmt.Println("金星搁哪呢") }
}
|

映射不会被复制
数组在赋值给新变量的时候会复制相关元素到新的内存空间,而map赋值给新的变量他俩指向的还是同一块内存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package main
import "fmt"
func main() { dwarfs := [5]string{ "Ceres", "Pluto", "Haumea", "Makemake", "Eris", } dwarfs1 := dwarfs dwarfs1[0] = "test" fmt.Println(dwarfs) fmt.Println(dwarfs1)
temperature := map[string]int{ "Earth": 15, "Mars": -65, } temp := temperature temp["Earth"] = 25 fmt.Println(temperature) fmt.Println(temp) }
|

使用make对映射进行预分配
1
| temperature := make(map[string]int,8)
|
使用映射进行计数
定义一个存放温度的切片,利用map进行计数,需要注意的是go在迭代映射的时候不保证键的顺序,所以各位代码运行结果只要正确,键值对顺序无所谓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package main
import "fmt"
func main() {
temperatures := []float64{ -28.0, 32.0, -31.0, -29.0, -23.0, -29.0, -28.0, -33.0, } frequency := make(map[float64]int) for _, i := range temperatures { frequency[i]++ } fmt.Println(frequency) for t, num := range frequency { fmt.Printf("%f 出现%d次\n", t, num) } }
|

使用映射和切片实现数据分组
以10度为一组划分温度属于哪个组,比如负二十度的一组,负三十度的一组,三十度的一度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package main
import ( "fmt" "math" )
func main() { temperatures := []float64{ -28.0, 32.0, -31.0, -29.0, -23.0, -29.0, -28.0, -33.0, } groups := make(map[float64][]float64) for _, t := range temperatures { g := math.Trunc(t/10) * 10 groups[g] = append(groups[g], t) } fmt.Println(groups) for g, t := range groups { fmt.Printf("%v:%v\n", g, t) }
}
|
将映射用作集合
集合是一种与数组类似但是集合中的元素只会出现一次,go语言没有直接提供集合收集器,所以我们利用映射拼凑一个集合
通过集合判断温度是否存在于相关映射中,并且映射中的值是否为true,最后创建一个切片吧温度数据存进去调用sort包的函数进行排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| package main
import ( "fmt" "sort" )
func main() { temperatures := []float64{ -28.0, 32.0, -31.0, -29.0, -23.0, -29.0, -28.0, -33.0, } set := make(map[float64]bool) for _, t := range temperatures { set[t] = true } if set[-28.0] { fmt.Println("set member") } fmt.Println(set) unique := make([]float64, 0, len(set)) for i := range set { unique = append(unique, i) } sort.Float64s(unique) fmt.Println(unique) }
|