整个程序首先创建并初始化了一个映射,然后向其中添加了五个学生的名字和分数,最后遍历这个映射并输出每个学生的名字和分数
package main
import "fmt"
//创建、填充并遍历一个映射(map),映射的键(key)是字符串类型,代表学生的名字,
// 值(value)是整型,代表学生的分数.
func main() {//students := make(map[string]int) // 创建一个空的mapvar students map[string]int //声明了一个名为students的变量,类型为map[string]int,此时students是nil,还没有初始化。students = make(map[string]int, 3) //使用make函数初始化了students映射,并指定了初始容量为3。尽管最终存储了5个元素,但这不会引起问题,因为Go语言会自动扩展映射的容量。// 添加学生及其分数到map中students["Alice"] = 85 //向students映射中添加了一个键值对,键是"Alice",值是85。students["Bob"] = 92students["Charlie"] = 78students["David"] = 90students["Eve"] = 88// 遍历map并输出每个学生的分数for name, score := range students { //使用for循环和range关键字遍历students映射。每次迭代都会返回一对键值。fmt.Printf("%s 的分数是 %d\n", name, score) //使用fmt.Printf函数格式化输出每个学生的名字和分数。%s用于字符串,%d用于整数。}
}
两段代码都是在Go语言中创建并初始化一个映射(map),映射的键(key)类型是string,值(value)类型是int。不过,它们在声明和初始化的方式上有所不同:
students := make(map[string]int)
- 直接使用make函数初始化映射:这行代码同时完成了映射的声明和初始化。students是通过:=操作符声明的,它的类型是通过make函数的返回值推断出来的,即map[string]int。这里没有指定映射的初始容量,Go会根据映射的使用情况自动进行内存分配。
var students map[string]int students = make(map[string]int, 3)
- 分步声明和使用make函数指定初始容量初始化映射:
这两行代码分别完成了映射的声明和初始化。首先,使用var关键字声明了一个名为students的变量,其类型为map[string]int,此时students是一个nil映射。然后,使用make函数初始化这个映射,并指定了一个初始容量(capacity)为5。指定容量是一个性能优化,如果你提前知道将要存储的键值对数量,这可以帮助减少随着元素添加时内部数据结构重新分配内存的次数。
区别总结:
1.第一种方式是声明并立即初始化映射的简写形式,不指定初始容量。
2.第二种方式是分步进行,允许在声明和初始化之间执行其他操作,且在初始化时指定了映射的初始容量。指定初始容量是可选的,主要用于性能优化。如果你对将要存储的元素数量有大致估计,预先指定一个容量可以减少后续动态扩容的次数,从而提高程序性能。
问题:如果我写了一个5 最后出现10个 会报错吗?
答:如果你在使用make函数初始化映射时指定了初始容量为5,然后实际上存储了10个键值对,这并不会导致报错。在Go语言中,映射的容量(capacity)是可以自动扩展的,以容纳更多的元素。初始容量的设定仅仅是一个性能优化手段,它可以减少随着元素不断添加时内部数据结构可能需要进行的重新分配次数。
在这段代码中,即使你添加了超过5个键值对到students映射中,Go语言的运行时系统会自动调整映射的容量以适应更多的元素,不会引发错误或异常。映射的容量是动态管理的,你不需要手动扩展或缩减。