如何使用Golang理解指针初始化_Golang创建和赋值指针变量


Go中指针变量默认初始化为nil,需用&取地址或new()分配内存才能安全使用;禁止对字面量取地址;解引用nil指针会panic。

怎么声明并初始化一个指针变量

Go 中不能直接声明未初始化的指针变量为 nil 以外的值,所有指针变量默认初始值都是 nil。要让它指向有效内存,必须用取地址符 & 显式获取某个变量的地址,或者用 new() 分配零值内存。

  • var p *intp*int 类型,值为 nil,此时解引用会 panic
  • var x int = 42; p := &x → 安全:p 指向栈上变量 x
  • p := new(int) → 返回指向新分配的零值 int 的指针(等价于 new(int) == &zero_int

为什么不能对字面量直接取地址

Go 禁止对临时值(如字面量、函数返回值)取地址,因为它们没有确定的内存生命周期。比如 &42&(x + y) 都会编译报错:cannot take the address of ...

  • 错误写法:p := &42 → 编译失败
  • 正确写法:先赋给变量再取址 —— val := 42; p := &val
  • 或用 new() 替代:p := new(int); *p = 42

new() 和 & 变量的区别在哪

两者都返回指针,但语义和内存位置不同:&x 指向已有变量(可能在栈或逃逸到堆),new(T) 总是在堆上分配零值 T 并返回其地址。

func example() {
    // &x:x 可能被优化到栈上(除非逃逸)
    x := 100
    p1 := &x

    // new(int):明确在堆分配,返回 *int 指向零值(即 0)
    p2 := new(int) // 等价于:p2 := &int(0)

    fmt.Println(*p1, *p2) // 输出:100 0
}
  • new(T) 只能创建零值,无法指定初始内容
  • 若需非零初始值,必须先 new(T) 再赋值,或用 &T{...} 复合字面量(适用于结构体等)
  • 对基本类型(如 intstring),&T{v} 不合法,只能用变量 + &new() + 赋值

常见 panic 场景:解引用 nil 指针

这是 Go 中最典型的指针错误。只要对值为 nil 的指针执行 *p 操作,运行时就 panic:invalid memory address or nil pointer dereference

立即学习“go语言免费学习笔记(深入)”;

  • 典型误用:var p *string; fmt.Println(*p) → 直接 panic
  • 安全习惯:使用前检查是否为 nil,尤其在函数参数或结构体字段中接收指针时
  • 结构体中嵌入指针字段(如 type User struct { Name *string }),JSON 反序列化后该字段可能为 nil,直接 *u.Name 很危险

指针本身不复杂,难的是判断“它到底有没有被正确定向”——尤其是跨函数传递、从 JSON/DB 加载、或用 new() 后忘记赋值时,容易漏掉这层检查。


# js  # json  # go  # golang  #   # 区别  # 为什么  # String  # 结构体  # int  # 指针  #   # Struct  # var  # pointer  # nil  # 或用  # 值为  # 的是  # 都是  # 这是  # 是在  # 尤其是  # 已有  # 适用于  # 能在 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: php条件判断怎么写_ifelse和switchcase的使用区别【对比】  MAC如何设置网卡MAC地址克隆_MAC终端修改物理地址与环境模拟【教程】  PHP接收参数长度超限怎么办_修改postmaxsize设置教程【解答】  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  Win11怎么开启游戏模式_Win11优化游戏帧数性能【教程】  如何使用Golang模拟请求超时_Golang context与HTTP请求测试实践  win11如何清理传递优化文件 Win11为C盘瘦身删除更新缓存【技巧】  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Win11怎么压缩文件 Win11自带压缩解压功能使用【教程】  如何在 PHP 中按相同键合并两个关联数组为二维数组  php订单日志怎么按状态筛选_php筛选不同状态订单日志教程【教程】  Win11怎么忘记WiFi网络_Win11删除已保存无线连接【教程】  php内存溢出怎么排查_php内存限制调试与优化方法【说明】  Mac的“预览”如何合并多个PDF_Mac文件处理技巧【效率】  Windows如何拦截2345弹窗广告_Windows拦截2345弹窗方法【步骤】  如何使用Golang log设置日志输出格式_Golang log日志格式示例  c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】  如何使用正则表达式提取以编号开头、后接多个注解的逻辑分组块  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  Python音视频处理高级项目教程_FFmpegPydub剪辑与特效  Win11讲述人怎么关闭_Win11误触开启语音朗读关闭【快捷键】  Win11怎么设置多显示器任务栏 Win11扩展任务栏至多屏方便跨屏操作【技巧】  Win11怎么退出高对比度模式_Win11取消反色显示快捷键【修复】  Flask 表单数据通过 SMTP 发送邮件的完整实现教程  Python多线程使用规范_线程安全解析【教程】  php能跑在stm32上吗_php在stm32微控制器上的移植方法【介绍】  windows 10应用商店区域怎么改_windows 10微软商店切换地区方法  Win11怎么设置DNS服务器_Windows11修改网络适配器DNS优选  Mac如何设置动态壁纸?(让桌面动起来)  如何在同包不同文件中正确引用 Go 结构体  如何使用Golang包导出规则_控制函数和变量可见性  Win11怎么设置桌面图标间距_Windows11注册表IconSpacing修改  如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法  Go 中的 := 运算符:类型推导机制与使用边界详解  如何在Golang中实现基础配置管理功能_Golang配置文件读取与更新示例  Windows10如何更改鼠标灵敏度_Win10鼠标属性指针选项调节  Python爬虫项目实战教程_Scrapy抓取与存储数据实例  c# await 一个已经完成的Task会发生什么  c++的STL算法库find怎么用 在容器中查找指定元素【实用教程】  Win11怎么设置鼠标宏_Win11鼠标按键自定义编程教程【详解】  Win11怎么关闭定位服务 Win11禁止应用获取位置信息【隐私】  Mac如何创建和管理多个桌面空间_Mac高效多任务处理【技巧】  如何在 Go 后端安全获取并验证前端存储的 JWT?  如何从 Go 的 map[string]interface{} 中安全获取值  PHP cURL GET请求:正确设置请求头与身份认证的完整教程  如何在Golang中优化文件读写性能_使用缓冲和并发处理  MAC怎么一键隐藏桌面所有图标_MAC极简模式切换与终端指令【方法】  php485在macos下怎么配置_php485 macOS系统配置指南【解答】  Win11怎样安装搜狗输入法_Win11安装搜狗输入法教程【步骤】  Win11怎么关闭触控板_Win11笔记本禁用触摸板快捷键 

 2026-01-05

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.