0

0

Golang指针如何修改变量值_通过指针操作变量技巧

P粉602998670

P粉602998670

发布时间:2026-01-21 13:23:02

|

793人浏览过

|

来源于php中文网

原创

必须用 解引用才能修改原变量值,指针本身只是地址,不加 操作的是指针变量自身;传指针进函数需用 *p 修改目标值,nil 指针解引用会 panic,须判空;结构体嵌套指针字段需逐层检查并初始化;new(T) 仅得零值指针,&T{} 支持字段初始化;返回局部变量地址安全,因逃逸分析自动移至堆。

golang指针如何修改变量值_通过指针操作变量技巧

* 解引用才能改原变量的值

Go 里指针本身只是个地址值,不加 * 就是在操作指针变量自己(比如赋新地址),不是在改它指向的值。常见错误是传指针进去却忘了 *,结果函数里看似“改了”,实际原变量毫发无伤。

实操要点:

  • 声明指针用 &,修改目标值必须用 * 前缀
  • 函数参数接收 *int,内部要写 *p = 42 才能改调用方的 int
  • nil 指针解引用会 panic,操作前建议判空(尤其从 map 或函数返回获取的指针)
func increment(p *int) {
    if p != nil { // 防 panic
        *p++
    }
}
x := 10
increment(&x)
// x 现在是 11

结构体指针字段赋值要注意是否已初始化

结构体指针字段(如 type User struct{ Profile *Profile })默认是 nil。直接写 u.Profile.Name = "Alice" 会 panic:assignment to entry in nil map / invalid memory address。

正确做法:

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

问小白
问小白

免费使用DeepSeek满血版

下载
  • 先检查 u.Profile != nil,再赋值
  • 或提前初始化:u.Profile = &Profile{}
  • 如果字段是嵌套指针(如 *map[string]int),需逐层判空 + 初始化
type Config struct {
    DB *DBConfig
}
c := &Config{}
if c.DB == nil {
    c.DB = &DBConfig{Host: "localhost"}
}
c.DB.Port = 5432 // 安全

new()&T{} 初始化指针的区别

两者都返回指向新分配零值的指针,但语义和适用场景不同:

  • new(T) 只能创建零值,返回 *T,适合简单类型或明确需要零值的场景
  • &T{Field: val} 支持字段初始化,更常用,尤其结构体
  • 切片、map、channel 不能用 new() 初始化(它们本身是引用类型,new([]int) 返回的是 *[]int,不是你想要的可 append 的切片)
// ✅ 正确
p1 := new(int)      // *int,值为 0
p2 := &User{Name: "Tom"} // *User,Name 已赋值

// ❌ 错误用法
s := new([]string)  // 得到 **[]string,不是能 append 的切片
// 应该用:
s := make([]string, 0)

函数返回局部变量地址是安全的

Go 编译器会自动做逃逸分析,把本该分配在上的变量提升到堆上,所以返回局部变量地址不会导致悬垂指针。这点和 C/C++ 完全不同,不必手动 malloc 或担心生命周期。

但要注意:

  • 返回局部变量地址是安全的,但返回局部数组/切片的元素地址可能有问题(因为底层数组可能被回收)
  • 若函数内创建大对象并返回其指针,可能增加 GC 压力,需结合性能权衡
  • 不要依赖“栈分配”做性能优化——Go 不保证也不暴露栈/堆细节
func getCounter() *int {
    x := 0 // x 会被自动移到堆上
    return &x
}
p := getCounter()
*p = 100 // 完全合法
真正容易出错的地方不在语法,而在忘记解引用、忽略 nil 检查、或误以为返回局部变量地址是危险操作——Go 把这些底层细节藏好了,你只需盯紧 *& 的配对,以及每个指针值是否真实指向有效内存。

相关专题

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

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

180

2024.02.23

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

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

228

2024.02.23

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

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

340

2024.02.23

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

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

209

2024.03.05

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

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

393

2024.05.21

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

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

197

2025.06.09

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

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

191

2025.06.10

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

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

233

2025.06.17

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

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

精品课程

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

共32课时 | 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号