当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:很久没分享东西了,最近人变懒了,但再懒也要月更一次,也就那点情怀了。

相关文章
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
104 13
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
79 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
60 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
3月前
|
缓存 Linux C++
map异常崩溃分析汇总
文章讨论了std::map和std::set在某些情况下崩溃的原因,包括结构体字节对齐问题、多线程资源同步问题、以及比较器的实现问题,并提供了相应的解决方案。
|
4月前
|
关系型数据库 MySQL
MySQl优化:使用 jemalloc 分配内存
MySQl优化:使用 jemalloc 分配内存
|
4月前
|
存储 JavaScript 算法
|
4月前
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理
|
5月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
137 8
|
5月前
|
NoSQL Redis C++
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
|
5月前
|
Java 运维
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
26 1