Go不支持C风格多级指针,但可通过嵌套指针类型(如int、*int)等效实现;二级指针常用于修改指针本身,三级及以上极少用,需逐层判空;推荐用结构体、切片、泛型等更清晰的替代方案。
Go 语言本身不支持传统 C 风格的多级指针(如 int***),因为 Go 的指针只能取地址(&)和解引用(*),且类型系统严格,*T 是一个具体类型,不能像 C 那样任意叠加星号。但“多级指针操作”在 Go 中可通过**嵌套指针类型**来等效实现——即指针指向另一个指针,再指向值。这本质上是合法、安全且常用的模式。
所谓“二级指针”,在 Go 中就是 **T 类型:它是一个指向 *T 的指针;“三级指针”即 ***T,指向 **T。虽然语法上允许,但实际开发中极少写超过两级,原因在于可读性下降、空指针风险上升、且多数场景可用结构体或接口更清晰地表达。
var p *int:一级指针,指向 intvar pp **int:二级指针,指向一个 *int
var ppp ***int:三级指针,指向一个 **int
二级指针最常见于需要**修改指针变量本身**的场景,比如函数内改变外部指针的指向。
func setPointerToFive(pp **int) {
*pp = new(int) // 分配新 int,让 pp 指向的指针指向它
**pp = 5 // 给这个新 int 赋值 5
}
func main() {
var p *int
fmt.Println(p) // nil
setPointerToFive(&p)
fmt.Println(*p) // 5
}
这里 &p 是 **int 类型(因 p 是 *int),传入后函数可通过 *pp 修改 p 本身,再通过 **pp 修改它最终指向的值。
三级指针(***T)通常只在极少数系统级抽象或泛型模拟中出现,例如封装一个“可变指针容器”。使用时务必逐层校验非 nil,否则 panic。
func updateIntThroughThreeLevels(ppp ***int) {
if ppp == nil || *ppp == nil || **ppp == nil {
panic("nil dereference at some level")
}
***ppp = 42 // 修改最底层的 int 值
}
func main() {
x := 10
p := &x
pp := &p
ppp := &pp
fmt.Println(**p) // 10
updateIntThroughThreeLevels(&ppp)
fmt.Println(**p) // 42
}
* 就多一级间接性&,解引用用 *,层数必须严格匹配nil,后续解引用都会 panic —— 生产代码中必须显式检查比起深层指针嵌套,Go 社区更倾向用以下方式表达间接性和可变性:
type Config s
truct { Data *int },清晰表达意图多级指针不是 Go 的设计重点,能不用就不用;若必须用,两级以内可控,三级起需格外谨慎。核心原则是:让代码意图自解释,而非靠指针层级炫技。
# go
# golang
# ai
# 封装
# 结构体
# int
# 指针
# 接口
# 引用类型
# 指针类型
# Struct
# 泛型
# var
# 空指针
# 切片
# nil
# map
# 可通过
# 不支持
# 极少
# 两级
# 是一个
# 则是
# 它是
# 只在
# 而非
# 这本
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
c++如何判断文件是否存在_c++ filesystem库用法
如何在Golang中指定模块版本_使用go.mod控制版本号
Golang如何避免指针逃逸_Golang逃逸分析与堆栈优化策略
Win11怎么关闭触摸键盘图标_Windows11任务栏系统托盘设置
PHP 中 require() 语句返回值的用法详解
Windows如何查看和管理已安装的字体?(字体文件夹)
如何使用Golang写入二进制文件_Golang io Write二进制写入示例
Mac如何整理桌面文件_Mac使用堆栈功能一键整理
Python多线程使用规范_线程安全解析【教程】
Win11怎么清理C盘虚拟内存_Win11清理虚拟内存设置【教程】
Mac电脑进水了怎么办_MacBook进水后紧急处理方法【必看】
Win11怎么关闭透明效果_Windows11个性化颜色关闭透明
MAC怎么在照片中添加水印_MAC自带编辑工具文字水印叠加【方法】
Win10如何卸载微软拼音输入法 Win10只保留一个输入法【教程】
LINUX的SELinux是什么_详解LINUX强制访问控制系统的入门与配置
如何在 Go 项目开发中正确处理本地包导入与远程模块路径的一致性问题
Win11怎么查看激活状态_查询Windows 11是否已永久激活【详解】
Win11任务栏怎么固定应用 Win11将软件图标固定到底部【步骤】
如何使用 Selenium 正确获取篮球参考网站球员名单元素列表
如何使用Golang反射创建map对象_动态生成键值映射
c++如何利用doxygen生成开发文档_c++ 代码注释规范与HTML文档导出【案例】
Win11怎么设置ip地址_Windows 11手动配置网络IP教程【详解】
Mac如何将HEIC图片格式转为JPG_Mac批量转换图片【指南】
Win11怎么更改计算机名_Windows11系统信息重命名设备教程
Win10如何更改网络连接_Windows10以太网属性IP配置
如何使用Golang table-driven fuzz测试_多数据随机化发现缺陷
php能跑在stm32上吗_php在stm32微控制器上的移植方法【介绍】
Win11怎么开启专注模式_Windows11时钟应用Focus Session
如何测试您的网站全球打开速度-网站海外测速工
Win11如何添加/删除输入法 Win11切换中英文输入法快捷键【设置】
如何使用Golang实现错误包装与传递_Golangfmt.Errorf%w使用实践
Win11如何设置环境变量 Win11添加和修改系统与用户变量【教程】
如何在Golang中引入测试模块_Golang测试包导入与使用实践
Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺方法【步骤】
Win11怎么设置开机问候语_自定义Win11锁屏提示信息【技巧】
Windows10系统怎么查看防火墙状态_Win10安全中心网络保护
Linux怎么实现内网穿透_Linux安装Frp客户端与服务端配置【方法】
VSC怎么快速定位PHP错误行_错误追踪设置法【方法】
Win11怎么更改任务栏颜色_Windows11个性化重音色设置
php命令行怎么运行_通过CLI模式执行PHP脚本的步骤【说明】
Win11怎么开启远程桌面_Win11系统远程桌面启用开关
c++ nullptr与NULL区别_c++11空指针规范
PythonGIL机制理解_多线程限制解析【教程】
如何在Golang中处理URL参数_Golang URL参数解析与路由映射方法
如何在Golang中编写端到端测试_Golang E2E测试流程示例
Win11怎么更改账户头像_Windows 11自定义用户头像图片设置【步骤】
如何解决Windows时间不准的问题?(自动同步设置)
Win11怎么设置多显示器任务栏 Win11扩展任务栏至多屏方便跨屏操作【技巧】
如何使用Golang encoding/json解析JSON_Golang encoding/json解析与序列化示例
如何使用Golang构建简易投票统计功能_Golang投票数据汇总与展示示例
2025-12-20
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。