如何使用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


相关推荐: c++的STL算法库find怎么用 在容器中查找指定元素【实用教程】  Win11怎么关闭自动更新 Win11永久关闭系统更新的有效方法【技巧】  Win11怎么关闭透明效果_Windows11个性化颜色关闭透明  用Python构建微服务架构实践_FastAPI与Django对比详解  Win10系统更新错误0x80240034怎么办 Win10更新错误解决法【方法】  Windows10系统怎么查看显卡驱动_Win10设备管理器驱动更新  Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】  如何使用Golang写入二进制文件_Golang io Write二进制写入示例  如何使用Golang实现错误包装与传递_Golangfmt.Errorf%w使用实践  php下载安装后swoole扩展怎么安装_异步框架支持【汇总】  php增删改查报错1054怎么办_字段名错误排查修复【解答】  如何使用Golang管理跨项目依赖_Golang多模块项目依赖实践  Mac如何彻底清理浏览器缓存?(Safari与Chrome)  Win10电脑怎么设置IP地址_Windows10网络属性固定IP配置  php怎么操作Redis_Redis扩展连接与基本命令使用方法【方法】  Linux如何安装Tomcat应用服务器_Linux环境部署与端口修改【教程】  Win11怎么关闭OneDrive同步_Win11取消自动备份文件【教程】  Python深度学习实战教程_神经网络模型构建与训练  如何在Golang中实现微服务负载均衡_Golang负载均衡策略与实现示例  Windows10如何更改鼠标图标_Win10鼠标属性指针浏览  c++怎么使用std::filesystem遍历文件夹_c++ 递归查找文件与权限修改【技巧】  c++如何实现一个高性能的环形队列(Ring Buffer)_c++无锁实现方法【并发】  Win11怎么设置闹钟_Windows 11时钟应用闹钟设置指南【详解】  Python对象生命周期管理_创建销毁说明【指导】  如何快速验证Golang安装是否成功_运行go version和hello world示例  如何在Golang中修改数组元素_通过指针实现原地更新  如何使用Golang处理静态文件缓存_提高页面加载速度  Mac如何解压zip和rar文件?(推荐免费工具)  Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录  Go 语言标准库为何不提供泛型 Contains 方法:设计哲学与类型系统约束  LINUX怎么进行文本内容搜索_Linux grep命令正则表达式用法大全【教程】  如何在Golang中使用replace替换模块_指定本地或远程路径  c++如何使用std::bitset进行位图算法_c++ 快速查找与大规模数据排重【方法】  C++如何使用std::async进行异步编程?(future用法)  Windows执行文件被SmartScreen拦截原因_安全提示与绕过方式  Windows10系统更新错误0x80070002_Win10自动更新失败手动修复  Mac上的iMovie如何剪辑视频?(新手入门教程)  Linux如何使用grep搜索文件内容_Linux下正则表达式匹配与查找技巧【指南】  mac怎么右键_MAC鼠标右键设置与触控板手势技巧【入门】  Win11怎么设置快速访问主页_Windows11资源管理器文件夹选项  如何在Golang中实现文件下载_Golang文件传输与内容类型处理方法  Win11相机打不开提示错误怎么修_相机权限开启与驱动修复【影像修复】  LINUX下如何配置VLAN虚拟局域网_在LINUX交换机与服务器上的实现  如何在JavaScript中动态拼接PHP的base_url与jQuery变量  Python大型项目拆分策略_模块化解析【教程】  php控制舵机角度怎么调_php发送pwm信号控制舵机转动【解答】  php串口通信波特率怎么选_根据硬件手册设置正确波特率【方法】  php和redis连接超时怎么办_phpredis调试连接问题汇总【指南】  如何在Golang中写入XML文件_生成符合规范的XML数据  Windows笔记本无法进入睡眠模式怎么办?(电源疑难解答) 

 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.