Go语言学习
  • README
  • Go 基础
    • go语言介绍
    • go语言主要特性
    • go内置类型和函数
    • init函数和main函数
    • 下划线
    • iota
    • 字符串
    • 数据类型:数组与切片
    • 数据类型:byte、rune与字符串
    • 变量的5种创建方式
    • 数据类型:字典
    • 指针
    • 数据类型:指针
    • 类型断言
    • 流程控制:defer延迟执行
    • 异常机制:panic和recover
    • 函数
    • go依赖管理
    • go中值传递、引用传递、指针传递区别
  • 标准库
    • Go net/http包
  • 数据结构
    • 哈希表
      • 为什么对 map 的 key 或 value 进行取址操作是不允许的
  • Gin
    • gin 快速开始
    • gin-swagger用法
  • Go 进阶
    • Go 指针
    • Go 中的 GC 演变是怎样的?
    • Go 的堆和栈
  • 面向对象
    • make 和 new 的区别
    • new(T) 和 &T{} 有什么区别?
  • 并发编程
    • Channel
    • Go语言 CSP 并发模型
    • GMP 模型原理
      • GMP 模型为什么要有 P ?
    • Go 协程池(goroutine pool)
    • Go语言常见的并发模式
    • Go并发实践:主动停止goroutine
  • 最佳实践
    • 发布Go语言模块
  • 软件包
    • 常用的GoLang包工具
    • Go的UUID生成
    • 现代化的命令行框架Cobra
    • 配置解析神器Viper
    • Go发送邮件gomail
    • Go反射框架Fx
    • NSQ消息队列的使用
    • Go爬虫框架colly
    • grpc-go 的安装和使用
Powered by GitBook
On this page

Was this helpful?

  1. 数据结构
  2. 哈希表

为什么对 map 的 key 或 value 进行取址操作是不允许的

在 Go 语言中,对 map 的 key 或 value 进行取址操作是不允许的。这是由于 map 的实现方式决定的。

在 Go 中,map 是通过哈希表实现的,它在内存中以一块连续的区域存储键值对数据。当我们向 map 中插入一个键值对时,Go 会根据键的哈希值将其存储在对应的位置上。而对于值,由于 map 是可变长度的数据结构,每个值的大小可能不同,因此无法在编译时确定值的存储位置。

因为 map 存储的值可能被重新分配内存,所以对 map 值进行取址会导致指针失效或指向错误的地址。这样一来,如果允许对 map 的 key 或 value 进行取址,那么在值发生重新分配的情况下,所有对该值的引用都会出错,这会带来很大的问题。

为了避免这种潜在的错误,Go 编译器禁止对 map 的 key 或 value 进行取址操作。如果你需要获取 map 中的值的地址,可以通过将值复制到一个临时变量中来实现:

goCopy Codevalue := myMap[key]
ptr := &value

这样做可以确保要取地址的是临时变量的副本,而不是原始 map 中的值。

Previous哈希表Nextgin 快速开始

Last updated 1 year ago

Was this helpful?