0

0

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

聖光之護

聖光之護

发布时间:2025-10-13 13:12:36

|

782人浏览过

|

来源于php中文网

原创

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函数提供了更灵活的控制,尤其是在性能优化方面。

LongCat AI
LongCat AI

美团推出的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创建方式。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

542

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

234

2023.09.06

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

446

2023.09.25

go语言编程软件有哪些
go语言编程软件有哪些

go语言编程软件有Go编译器、Go开发环境、Go包管理器、Go测试框架、Go文档生成器、Go代码质量工具和Go性能分析工具等。本专题为大家提供go语言相关的文章、下载、课程内容,供大家免费下载体验。

249

2023.10.13

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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