目录
1.map的声明方式
Go语言的Map有三种声明方式,其声明方式和slice相似,第一种声明方式,是先声明再使用make开辟空间:
package main
import "fmt"
func main() {
// 声明一个map,其键和值均为string类型,[key类型]value类型,注意仅仅是声明是没有开辟内存空间的,其值为nil(空)
var myMap1 map[string]string;
if (myMap1 == nil) {
fmt.Println("myMap1 is empty")
}
// 给myMap1开辟空间,make的第二个参数为开辟空间的大小,并添加一些值
myMap1 = make(map[string]string, 10)
myMap1["one"] = "apple"
myMap1["two"] = "banana"
myMap1["three"] = "orange"
// 打印myMap1
fmt.Println(myMap1)
}
运行结果:
myMap1 is empty
map[one:apple three:orange two:banana]
可以看到,Go语言中光声明map类型是没有开辟地址空间的,需要使用make来开辟内存空间,这里同样有一个问题,就是如果添加的键值对超过预先开辟的内存空间会怎么样呢?答案是和slice切片中是一样的,会再次开辟同样容量的空间,在上面这个例子中就是如果已经有10个键值对了,那么再添加一个键值对,那么将再开辟10个空间用来存储。Go语言同样可以直接声明并开辟空间,那就是第二种声明方式,那就要用上:=了,看个例子
package main
import "fmt"
func main() {
// 声明一个map,其键和值均为string类型,[key类型]value类型
myMap1 := make(map[string]string);
if (myMap1 == nil) {
fmt.Println("myMap1 is empty")
}
myMap1["one"] = "apple"
myMap1["two"] = "banana"
myMap1["three"] = "orange"
// 打印myMap1
fmt.Println(myMap1)
}
运行结果:
map[one:apple three:orange two:banana]
可以看到,开辟了空间后,myMap1就不再是nil了,且这也是map的其中一种声明方式,当然,我们在使用make开辟空间的时候也可以省略第二个参数,则Go语言底层会开辟默认大小的空间来进行存储。(这里我直接省略了第二参数,在不能预估具体键值对数量的情况下直接使用默认就好)。我们再看看第三种声明方式,即声明并赋一些初始值。
package main
import "fmt"
func main() {
// 声明一个map,其键和值均为string类型,[key类型]value类型,并赋一些初始值
myMap1 := map[string]string{"one":"apple","two":"banana","three":"orange"}
fmt.Println(myMap1)
}
运行结果:
map[one:apple three:orange two:banana]
可以看到,可以直接对map做一些初始化。
总结,map的三种声明方式均很实用,具体使用哪种都是看具体需求,可以选择先声明,再开辟空间再赋值,也可以直接声明加赋值。
2.map的一些基本操作
2.1 遍历
map的遍历方式与slice类似,slice返回的是index,vlaue,map则返回的是key和value
package main
import "fmt"
func main() {
myMap1 := map[string]string{"one":"apple","two":"banana","three":"orange"}
//遍历
for key, value := range myMap1 {
fmt.Println("key = ", key, "value = ", value)
}
}
运行结果:
key = one value = apple
key = two value = banana
key = three value = orange
2.2 map的添加键值对的方式
package main
import "fmt"
func main() {
myMap1 := map[string]string{"one":"apple","two":"banana","three":"orange"}
//添加一个键值对
myMap1["four"] = "pear"
//遍历
for key, value := range myMap1 {
fmt.Println("key = ", key, "value = ", value)
}
}
运行结果:
key = one value = apple
key = two value = banana
key = three value = orange
key = four value = pear
2.3 map的删除键值对的方式
package main
import "fmt"
func main() {
myMap1 := map[string]string{"one":"apple","two":"banana","three":"orange"}
//删除一个键值对
delete(myMap1, "two")
//遍历
for key, value := range myMap1 {
fmt.Println("key = ", key, "value = ", value)
}
}
运行结果
key = one value = apple
key = three value = orange
2.4 map的修改键值对的方式
package main
import "fmt"
func main() {
myMap1 := map[string]string{"one":"apple","two":"banana","three":"orange"}
//修改一个键值对
myMap1["two"] = "pear"
//遍历
for key, value := range myMap1 {
fmt.Println("key = ", key, "value = ", value)
}
}
运行结果:
key = one value = apple
key = two value = pear
key = three value = orange
总结:map存储的顺序不一定是有序的,对于添加和修改方式是相同的,如果key存在,则是修改原来的值,若不在,则添加该键值对。