0

0

如何正确通过指针参数在 Go 函数中初始化并返回对象引用

碧海醫心

碧海醫心

发布时间:2026-01-09 16:55:52

|

619人浏览过

|

来源于php中文网

原创

如何正确通过指针参数在 Go 函数中初始化并返回对象引用

go 中函数参数按值传递,即使传入指针,也只是该指针值的副本;若需在函数内修改原始指针变量本身(如使其指向新分配的对象),必须传入指向指针的指针(即 `**t`),并在函数内解引用赋值。

在 Go 语言中,所有函数参数都是按值传递的——这意味着当你把一个变量(包括指针)传给函数时,函数接收到的是该值的一个副本。这与 C/C++ 中“传指针可修改原值”的直觉类似,但有一个关键区别Go 中的指针本身也是值。因此,func f(p *T) 接收的是 *T 类型值的副本,对 p 的重新赋值(如 p = &x)只会影响副本,不会影响调用方的原始指针变量。

回到你的代码问题:

var session *mgo.Session
ConnectToMongo(session) // 传入的是 nil 指针的副本

此时 ConnectToMongo 内部的 session 参数只是原始 session 变量的一个拷贝。即使你在函数内执行 session, err = mgo.Dial(...),也只是改变了这个局部副本的值,调用结束后,main 中的 session 依然为 nil。

✅ 正确做法是:使用双指针(**mgo.Session),让函数能修改原始指针变量所存储的地址:

堆友
堆友

Alibaba Design打造的设计师全成长周期服务平台,旨在成为设计师的好朋友

下载
func ConnectToMongo(session **mgo.Session) {
    if *session == nil { // 注意:这里检查的是 *session,而非 session
        var err error
        *session, err = mgo.Dial("localhost:27028") // ✅ 解引用后赋值到原始变量
        if err != nil {
            panic(err)
        }
    }
}

func main() {
    var session *mgo.Session
    ConnectToMongo(&session) // 传入 session 变量的地址(即 **mgo.Session)
    if session == nil {
        fmt.Println("nil. Why?") // 不会执行
    } else {
        fmt.Println("Connected successfully.") // ✅ 此时 session 已被正确初始化
    }
}

⚠️ 关键细节提醒:

  • if session == nil 在 **T 函数中检查的是指针的指针是否为空(即 &session 是否为 nil),而我们要判断的是目标指针是否为空,所以应写 if *session == nil;
  • 调用时务必使用 &session,确保传入的是原始指针变量的地址;
  • 更现代、更符合 Go 习惯的写法是直接返回值,而非依赖多级指针副作用:
func ConnectToMongo() (*mgo.Session, error) {
    return mgo.Dial("localhost:27028")
}

func main() {
    session, err := ConnectToMongo()
    if err != nil {
        panic(err)
    }
    defer session.Close() // 记得关闭连接
    fmt.Println("Connected.")
}

这种返回式设计更清晰、更易测试、更符合 Go 的惯用法(Explicit is better than implicit),应优先采用。仅在需要复用已有变量或满足特定接口约束时,才考虑双指针方案。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

723

2023.08.22

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

306

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

725

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

88

2025.08.19

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1008

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

57

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

353

2025.12.29

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

106

2024.02.23

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

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

精品课程

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

共32课时 | 3.5万人学习

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号