0

0

如何在Golang中使用指针_Golang指针定义与使用方法

P粉602998670

P粉602998670

发布时间:2026-01-31 11:59:20

|

199人浏览过

|

来源于php中文网

原创

Go指针是安全可控的内存引用,声明为T,需避免nil解引用;传指针可修改原变量,slice/map/channel本身是引用类型,无需额外加。

如何在golang中使用指针_golang指针定义与使用方法

Go 语言中的指针不是“C 风格的危险工具”,而是明确、可控的内存地址引用——只要不越界解引用或传 nil,它就是安全的。

如何声明和初始化一个指针变量

Go 的指针类型语法是 *T,表示“指向类型 T 的值的地址”。声明时必须指定所指类型,不能像 C 那样用 void* 混用。

常见错误:直接对未初始化的指针解引用(panic: runtime error: invalid memory address)。

  • var p *int 声明了一个 int 类型指针,但此时 p == nil,不能直接写 *p = 10
  • 正确初始化方式之一:num := 42; p := &num& 取地址,p 现在指向 num 的内存位置
  • 也可用 new():p := new(int),等价于 var v int; p := &v,返回已分配零值的地址

函数参数传指针 vs 传值的区别

Go 默认按值传递——函数内修改形参不会影响实参。想让函数修改原始变量,必须传指针。

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

典型场景:修改结构体字段、避免大对象拷贝、实现“输出参数”语义。

uBrand
uBrand

一站式AI品牌创建平台,在线品牌设计,AI品牌策划,智能品牌营销;uBrand帮助创业者轻松打造个性品牌!

下载
  • 传值:func modify(x int) { x = 100 } → 调用后原变量不变
  • 传指针:func modify(x *int) { *x = 100 } → 必须用 *x 解引用赋值
  • 结构体传指针更常见:func (u *User) setName(n string) { u.name = n },否则方法无法修改接收者字段

nil 指针检查与常见 panic 场景

Go 不做空指针自动防护,*pp == nil 时立即 panic。这要求你主动判断,而不是依赖运行时兜底。

容易踩坑的地方:函数返回指针但没检查是否为 nil;接口变量底层是 nil 指针却直接调用方法。

  • 安全解引用前务必检查:if p != nil { val := *p }
  • 从 map、channel、slice 中取值再取地址?注意它们可能返回零值,&m["key"] 在 key 不存在时会取到 &zeroValue,但该地址有效;而 m["key"] 本身是零值,取地址没问题,但若原 map 值是 struct 指针,要小心嵌套 nil
  • 方法接收者为指针时,nil 接收者调用方法不会 panic —— 除非方法内部访问了 *receiver 字段(比如 receiver.field

切片、map、channel 本身已经是引用类型,不需要额外加 *

新手常误以为“要修改 slice 就得传 *[]T”,其实完全没必要。slice 本身包含指向底层数组的指针、长度和容量,传 slice 就是传这三个字段的副本,修改元素或用 append 改变底层数组内容都生效;但若想改变 slice 头部(如让它指向新数组),才需要传 *[]T

  • func update(s []int) { s[0] = 999 } → 原 slice 第一个元素被改
  • func reassign(s *[]int) { *s = []int{1,2,3} } → 原 slice 变成新切片
  • map 和 channel 同理:传 map[string]int 即可增删改查;只有想让函数替换整个 map 变量(比如清空并重置为新 map)才需 *map
package main

import "fmt"

type User struct {
	Name string
}

func main() {
	age := 25
	p := &age
	fmt.Println(*p) // 25

	// 修改原变量
	*p = 26
	fmt.Println(age) // 26

	u := User{Name: "Alice"}
	pu := &u
	pu.Name = "Bob" // 等价于 (*pu).Name = "Bob"
	fmt.Println(u.Name) // Bob
}

指针真正的复杂点不在语法,而在你是否清楚某个值的生命周期是否覆盖指针的使用范围——比如返回局部变量地址(Go 编译器会自动逃逸分析并堆分配,通常安全),但手动管理 C 内存或 CGO 场景下,这点就极易出错。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

182

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

229

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

343

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

396

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

240

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

194

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

478

2025.06.17

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

8

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.4万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号