
本文深入探讨go语言中创建map的两种主要方式:使用字面量`map[t]u{}`和`make`函数。我们将阐明当创建空map时,`map[t]u{}`与`make(map[t]u)`的等价性,并重点介绍`make`函数在指定初始容量以优化性能方面的独特优势,帮助开发者根据具体需求选择最合适的map初始化方法。
在Go语言中,map是一种无序的键值对集合,广泛应用于数据存储和检索。创建map主要有两种方式:使用map字面量(Map Literal)和使用内置的make函数。理解这两种方式的异同及其背后的性能考量,对于编写高效的Go代码至关重要。
1. 使用Map字面量创建Map
Map字面量提供了一种简洁的方式来初始化map,尤其适用于在创建时就指定初始键值对的场景。
1.1 创建带有初始值的Map
当map在创建时就需要包含一些预设的键值对时,map字面量是首选。其语法结构为map[KeyType]ValueType{key1: value1, key2: value2, …}。
示例:
立即学习“go语言免费学习笔记(深入)”;
package mainimport "fmt"func main() { // 创建一个包含初始值的map m := map[bool]string{false: "FALSE", true: "TRUE"} fmt.Println("带有初始值的map:", m) // 输出: 带有初始值的map: map[false:FALSE true:TRUE]}
1.2 创建空的Map
Map字面量也可以用来创建空的map。当不提供任何键值对时,{}表示一个空的map。
示例:
立即学习“go语言免费学习笔记(深入)”;
package mainimport "fmt"func main() { // 使用map字面量创建空的map var m1 = map[string]int{} fmt.Printf("m1 类型: %T, 值: %v, 是否为空: %tn", m1, m1, len(m1) == 0) // 输出: m1 类型: map[string]int, 值: map[], 是否为空: true}
值得注意的是,var m = map[string]int{} 这种形式,本质上是map[T]U{}这种map字面量的特殊情况,即它是一个没有初始键值对的字面量。它会创建一个已经初始化但为空的map。
2. 使用make函数创建Map
make是Go语言的一个内置函数,专门用于创建切片(slice)、map和通道(channel)。对于map而言,make函数提供了更灵活的控制,尤其是在性能优化方面。
2.1 创建空的Map
使用make(map[KeyType]ValueType)可以创建一个空的map。
示例:
立即学习“go语言免费学习笔记(深入)”;
package mainimport "fmt"func main() { // 使用make函数创建空的map var m2 = make(map[string]int) fmt.Printf("m2 类型: %T, 值: %v, 是否为空: %tn", m2, m2, len(m2) == 0) // 输出: m2 类型: map[string]int, 值: map[], 是否为空: true}
2.2 指定初始容量创建Map
make函数最显著的优势在于它允许指定map的初始容量。其语法为make(map[KeyType]ValueType, capacity)。capacity参数告诉Go运行时为map预分配足够的内存空间,以容纳指定数量的元素。
示例:
立即学习“go语言免费学习笔记(深入)”;
package mainimport "fmt"func main() { // 使用make函数创建指定初始容量的map m3 := make(map[string]int, 50) fmt.Printf("m3 类型: %T, 值: %v, 初始容量 (内部实现, 不直接暴露): >=50n", m3, m3) // 填充一些数据 for i := 0; i < 10; i++ { m3[fmt.Sprintf("key%d", i)] = i } fmt.Println("填充数据后的m3:", m3)}
性能考量:当你知道map将要存储的元素大致数量时,预先指定一个合适的容量可以显著提升性能。这是因为map在内部需要管理其底层存储结构。如果map在增长过程中频繁达到其容量上限,Go运行时就需要进行内存重新分配和哈希表重构(rehash)操作,这些操作会带来额外的性能开销。通过make函数预分配空间,可以减少甚至避免这些昂贵的重分配操作,尤其是在map预计会存储大量元素时,效果更为明显。
3. 两种方式的等价性与选择建议
3.1 等价性
对于创建空的map而言,var m = map[T]U{} 和 var m = make(map[T]U) 是完全等价的。它们都创建并初始化了一个空的map,可以直接使用。
package mainimport "fmt"func main() { m1 := map[string]int{} m2 := make(map[string]int) fmt.Println("m1 == m2 (逻辑上等价):", fmt.Sprintf("%p", m1) != fmt.Sprintf("%p", m2) && len(m1) == 0 && len(m2) == 0) // 它们是不同的map实例,但都为空 fmt.Println("m1是否为空:", len(m1) == 0) fmt.Println("m2是否为空:", len(m2) == 0) // 它们都已初始化,可以直接赋值 m1["apple"] = 1 m2["banana"] = 2 fmt.Println("m1:", m1) fmt.Println("m2:", m2)}
3.2 选择建议
创建带有初始值的map: 始终使用map字面量,因为它最直观和简洁。
myMap := map[string]string{"name": "Alice", "city": "New York"}
创建空的map且不确定最终大小: 两种方式均可,map[T]U{}可能略微更简洁。
// 简洁写法emptyMap := map[string]int{}// 或emptyMap2 := make(map[string]int)
创建空的map且已知大致的元素数量: 强烈建议使用make函数并指定初始容量,以优化性能。
// 预计将存储1000个元素largeMap := make(string, 1000)
总结
Go语言提供了两种灵活的方式来创建map:map字面量和make函数。当需要初始化一个带有特定键值对的map时,map字面量是最佳选择。当创建空的map时,两种方式在功能上是等价的。然而,make函数通过允许指定初始容量,为map的性能优化提供了独有的能力,特别是在处理大量数据时,合理预估并设置容量可以有效减少内存重分配和哈希重构的开销,从而提升程序的运行效率。开发者应根据具体的应用场景和性能需求,灵活选择合适的map创建方式。
以上就是Go语言中创建Map的两种方式:字面量与make函数详解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1413339.html
微信扫一扫
支付宝扫一扫