Golang中为什么需要先分配map才能存储数据

Golang中为什么需要先分配map才能存储数据

package main

import(
  "fmt"
)

func main(){
   var ages map[string]int     // 声明 1
   ages := make(map[string]int)     // 声明 2
   ages["Ujjwal"] = 32

   fmt.Println(ages)
}

在阅读这本书时,我遇到了这样一句话:“你必须先分配映射,然后才能向其中存储数据。”。如果我们注释掉声明 2 并运行这段代码,会得到一个错误:“panic: assignment to entry in nil map”。而如果我们注释掉声明 1,代码就能顺利运行。我无法理解“你必须先分配映射,然后才能向其中存储数据。”这句话在上述代码上下文中的含义。


更多关于Golang中为什么需要先分配map才能存储数据的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

当你声明一个变量时,你仅仅是声明它,也就是说,你没有初始化它。而如果你使用 :=,它会被声明并初始化。

你也可以使用 var 达到同样的效果,如果你这样做:

var ages map[string]int = make(map[string]int)

更多关于Golang中为什么需要先分配map才能存储数据的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,var ages map[string]int 只是声明了一个变量 ages,其类型为 map[string]int,但此时该映射为 nil(零值)。nil 映射不能直接用于存储键值对,尝试向其写入数据会导致运行时 panic。

ages := make(map[string]int) 使用 make 函数分配并初始化了一个映射,返回一个已初始化的映射,此时可以向其中安全地插入数据。

以下是示例代码,演示了两种声明方式的区别:

package main

import "fmt"

func main() {
    // 声明但未分配,映射为 nil
    var nilMap map[string]int
    fmt.Println(nilMap == nil) // 输出: true

    // 尝试向 nil 映射写入数据会导致 panic
    // nilMap["key"] = 42 // panic: assignment to entry in nil map

    // 使用 make 分配映射
    allocatedMap := make(map[string]int)
    fmt.Println(allocatedMap == nil) // 输出: false

    // 安全地存储数据
    allocatedMap["Ujjwal"] = 32
    fmt.Println(allocatedMap) // 输出: map[Ujjwal:32]
}

映射的零值是 nilnil 映射在读取时表现为空映射,但写入操作未定义。make 函数分配并初始化底层数据结构,使映射准备好进行读写操作。因此,在存储数据前必须先分配映射。

回到顶部