首页 > 后端开发 > Golang > 正文

Go语言中创建Map的两种方式:字面量与make函数详解

聖光之護
发布: 2025-10-13 13:12:36
原创
767人浏览过

Go语言中创建Map的两种方式:字面量与make函数详解

本文深入探讨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 main

import "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 main

import "fmt"

func main() {
    // 使用map字面量创建空的map
    var m1 = map[string]int{}
    fmt.Printf("m1 类型: %T, 值: %v, 是否为空: %t\n", 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函数提供了更灵活的控制,尤其是在性能优化方面。

怪兽AI数字人
怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44
查看详情 怪兽AI数字人

2.1 创建空的Map

使用make(map[KeyType]ValueType)可以创建一个空的map。

示例:

立即学习go语言免费学习笔记(深入)”;

package main

import "fmt"

func main() {
    // 使用make函数创建空的map
    var m2 = make(map[string]int)
    fmt.Printf("m2 类型: %T, 值: %v, 是否为空: %t\n", 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 main

import "fmt"

func main() {
    // 使用make函数创建指定初始容量的map
    m3 := make(map[string]int, 50)
    fmt.Printf("m3 类型: %T, 值: %v, 初始容量 (内部实现, 不直接暴露): >=50\n", 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 main

import "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函数详解的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号