go语言学习系列教程(7)---Maps


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

1:创建Map

语法:make(map[type of key]type of value)
testMap := make(map[string]int)
map 的零值是 nil。如果你想添加元素到 nil map 中,map 必须使用 make 函数初始化

package main

import (
    "fmt"
)

func main() {  
    var testMap map[string]int
    if testMap == nil {
        testMap = make(map[string]int)
    }
}

2:map元素的增加,获取,删除

给 map 添加新元素的语法和数组相同

package main

import (
    "fmt"
)

func main() {
    testMap := make(map[string]int)
    testMap["a1"] = 12000
    testMap["a2"] = 15000
    testMap["a3"] = 9000
    fmt.Println("testMap map contents:", testMap)
}

上面的程序输出:

testMap map contents: map[a1:12000 a2:15000 a3:9000]

你也可以在声明的时候初始化 map。

package main

import (  
    "fmt"
)

func main() {  
    testMap := map[string]int {
        "a1": 12000,
        "a2": 15000,
    }
    testMap["a3"] = 9000
    fmt.Println("testMap map contents:", testMap)
}

输出:

testMap map contents: map[a1:12000 a2:15000 a3:9000]

键不一定只能是 string 类型。所有可比较的类型,如 boolean,interger,float,complex,string 等,都可以作为键

目前我们已经给 map 添加了几个元素,现在学习下如何获取它们。获取 map 元素的语法是 map[key]

package main

import (  
    "fmt"
)

func main() {  
    testMap := map[string]int {
        "a1": 12000,
        "a2": 15000,
    }
    testMap["a3"] = 9000
  	vauleKey := "a2"
    fmt.Println("vaule of", vauleKey, "is", testMap[vauleKey])
}
输出
vaule of a2 is 15000

如果获取一个不存在的元素,会发生什么呢?map 会返回该元素类型的零值

package main

import (  
    "fmt"
)

func main() {  
    testMap := map[string]int {
        "a1": 12000,
        "a2": 15000,
    }
    testMap["a3"] = 9000
  	vauleKey := "a2"
    fmt.Println("vaule of", vauleKey, "is", testMap[vauleKey])
  	fmt.Println("vaule of", "a4", "is", testMap[a4])
}
输出:
vaule of a2 is 15000
vaule of a2 is 0

如果我们想知道 map 中到底是不是存在这个 key,该怎么做

value, ok := map[key]
package main

import (
    "fmt"
)

func main() {
     testMap := map[string]int {
        "a1": 12000,
        "a2": 15000,
    }
    testMap["a3"] = 9000
    newEmp := "a4"
    value, ok := testMap[newEmp]
    if ok == true {
        fmt.Println("value of", newEmp, "is", value)
    } else {
        fmt.Println(newEmp,"not found")
    }
}
输出:
a4 not found

遍历 map 中所有的元素需要用 for range 循环

package main

import (
    "fmt"
)

func main() {
    testMap := map[string]int {
        "a1": 12000,
        "a2": 15000,
    }
    testMap["a3"] = 9000
    fmt.Println("All items of a map")
    for key, value := range testMap {
        fmt.Printf("testMap[%s] = %d\n", key, value)
    }
}

如何删除map中的一个元素?
删除 map 中 key 的语法是 delete(map, key)。这个函数没有返回值。

package main

import (
    "fmt"
)

func main() {
    testMap := map[string]int {
        "a1": 12000,
        "a2": 15000,
    }
    testMap["a3"] = 9000
 		fmt.Println("map before deletion", testMap)
    delete(personSalary, "a3")
    fmt.Println("map after deletion", testMap)
}
输出:
map before deletion map[a1:12000 a2:15000 a3:9000] 
map after deletion map[a1:9000 a2:15000]

3:map的长度

获取 map 的长度使用 len 函数。

package main

import (
    "fmt"
)

func main() {
    testMap := map[string]int {
        "a1": 12000,
        "a2": 15000,
    }
    testMap["a3"] = 9000
 		fmt.Println("length is", len(testMap))//输出:length is 3

}

4:map是引用类型

和 slices 类似,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)

}

上面程序中,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]

5:map的比较

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaowen2008821

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值