当map在不提前分配内存的时候为什么会抛异常?

简介: 当map在不提前分配内存的时候为什么会抛异常?

什么是map?

概念性的东西百度已经烂大街,啰嗦一大堆毫无价值意义,直接剖析本篇的议题:当map在不提前分配内存的时候为什么会抛异常?

议题开始

  1. 先看下面代码
package main
import (
 "fmt"
)
func main() {
 var a map[string]string
 a["name"] = "hello"
 fmt.Println(a)
}
  1. 运行代码后GG了

异常就对了,不抛异常还真就不正常了。

  1. 为何异常

为啥抛出panic异常了?因为map是引用类型,必须先分配内存空间,直接就给key和vaule肯定不行,因为没地方存呢!

引用类型最大的特点就是变量存储的是一个地址,这个地址对应的空间里才是真正存储的值。所以说,连内存空间都不提前分配,怎么可以存储东东进去呢!

引用类型有:

  • slice
  • channel
  • map
  1. 使用make来创建map

make()是Go语言内存分配的内置函数,使用它来创建map

package main
import (
 "fmt"
)
func main() {
 var a map[string]string
 a = make(map[string]string, 10)
 fmt.Println(a)
}

执行后

很明显,已经可以得到一个可以存东东的map了,容量是10,key和value都是字符串。给定的容量是10,有个好处是:提前申请好额外的内存空间,这样可以避免二次分配内存带来的开销,可以提高程序的性能。

  1. 还可以简写成
a := make(map[string]string, 10)
  1. 可以存东东了
package main
import (
 "fmt"
)
func main() {
 a := make(map[string]string, 10)
 a["name"] = "bubeiguoyunwei"
 fmt.Println(a)
}
  1. 还有一个玩法
package main
import "fmt"
func main() {
 a := map[string]string{
  "name": "root",
  "ip":   "10.1.1.1",
 }
 fmt.Println(a)
}

咦!不用make了?map数据类型初始化是有两种方式的,如下:

  • make(map[string]string)
  • map[string]string{}

写在最后

本篇的分享告一段落,PS:很久没分享东西了,最近人变懒了,但再懒也要月更一次,也就那点情怀了。

相关文章
|
5天前
|
存储 程序员 编译器
在C语言中.如何正确地分配和释放内存docx
在C语言中.如何正确地分配和释放内存docx
20 1
|
5天前
|
存储 C++
C/C++数据类型从0到内存具体分配详解
C/C++数据类型从0到内存具体分配详解
|
5天前
|
算法 编译器
内存学习(七):伙伴分配器(正式版)1
内存学习(七):伙伴分配器(正式版)1
65 0
|
7月前
|
程序员 C语言
c语言:通讯录管理系统(动态分配内存版)
c语言:通讯录管理系统(动态分配内存版)
36 0
c语言:通讯录管理系统(动态分配内存版)
|
5天前
关于为什么要在链表中用malloc来分配内存
关于为什么要在链表中用malloc来分配内存
|
5天前
为对象分配内存TLAB
为对象分配内存TLAB
|
5天前
|
Java
SpringBoot 项目启动初始化一个Map对象到内存
SpringBoot 项目启动初始化一个Map对象到内存
|
5天前
|
存储 编译器 程序员
【C语言】内存的动态分配与释放
【C语言】内存的动态分配与释放
29 0
|
5天前
|
存储 C语言
怎样建立内存的动态分配
怎样建立内存的动态分配
10 0
|
5天前
|
存储 机器学习/深度学习 Java
什么是内存的动态分配
什么是内存的动态分配
13 0