Go 中如何正确通过指针参数初始化结构体指针变量
发布时间 - 2026-01-09 00:00:00 点击率:次在 go 中,若想通过函数参数修改外部指针变量的值(如将 `*mgo.session` 从 nil 初始化为有效地址),必须传递**指向该指针的指针(即 `**t`)**,否则仅传递 `*t` 会导致函数内对指针的赋值仅作用于副本,无法影响调用方变量。
这是 Go 值语义特性的典型体现:所有函数参数都是按值传递的。即使你传入的是一个指针 *T,传递的也只是该指针的拷贝——它和原指针指向同一地址,但二者本身是独立的变量。因此,在函数内部对 session 变量重新赋值(如 session = mgo.Dial(...)),只会改变这个局部拷贝的指向,而不会改变 main 中的 session。
要真正修改调用方的指针变量,必须传递其地址,即 &session,此时形参类型需为 **mgo.Session,并在函数内通过解引用 *session 来更新原始指针:
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 // 初始为 nil
ConnectToMongo(&session) // 传入 session 的地址
if session == nil {
fmt.Println("nil. Why?") // 不会执行
} else {
fmt.Println("Connected successfully.") // 正确输出
}
}⚠️ 关键注意事项:
- 第二版代码中你已正确使用 **mgo.Session 和 &session,但原示例存在逻辑错误:if session == nil 应改为 if *ses
sion == nil —— 否则条件永远为 false(因为 session 是 **mgo.Session 类型,只要传入了有效地址,它自身就非 nil); - mgo 已归档不再维护,生产环境建议迁移到官方驱动 mongo-go-driver,其连接管理更符合现代 Go 惯例(如返回 *mongo.Client 并显式错误处理);
- 更推荐的 Go 风格是让函数返回所需对象,而非依赖指针参数“输出”结果,例如:
func NewMongoSession(url string) (*mgo.Session, error) { return mgo.Dial(url) } // 使用: session, err := NewMongoSession("localhost:27028") if err != nil { panic(err) }
这种写法更清晰、更易测试,也避免了指针误用带来的隐蔽问题。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在建站宝盒中设置产品搜索功能?
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
大连 网站制作,大连天途有线官网?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
黑客入侵网站服务器的常见手法有哪些?
googleplay官方入口在哪里_Google Play官方商店快速入口指南
Laravel如何实现文件上传和存储?(本地与S3配置)
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Laravel如何实现API速率限制?(Rate Limiting教程)
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
成都网站制作公司哪家好,四川省职工服务网是做什么用?
如何在阿里云通过域名搭建网站?
详解Oracle修改字段类型方法总结
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
微信小程序 scroll-view组件实现列表页实例代码
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
如何用景安虚拟主机手机版绑定域名建站?
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
如何用VPS主机快速搭建个人网站?
如何确认建站备案号应放置的具体位置?
网页设计与网站制作内容,怎样注册网站?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
深圳网站制作平台,深圳市做网站好的公司有哪些?
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
如何生成腾讯云建站专用兑换码?
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
javascript基于原型链的继承及call和apply函数用法分析
创业网站制作流程,创业网站可靠吗?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
如何快速辨别茅台真假?关键步骤解析
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何快速查询网址的建站时间与历史轨迹?
如何在Tomcat中配置并部署网站项目?
历史网站制作软件,华为如何找回被删除的网站?
Laravel如何实现事件和监听器?(Event & Listener实战)
如何在企业微信快速生成手机电脑官网?
如何在阿里云域名上完成建站全流程?
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Laravel怎么上传文件_Laravel图片上传及存储配置
Laravel怎么在Blade中安全地输出原始HTML内容
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Laravel storage目录权限问题_Laravel文件写入权限设置
如何在云主机上快速搭建多站点网站?
Windows Hello人脸识别突然无法使用
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
如何用美橙互联一键搭建多站合一网站?
Java垃圾回收器的方法和原理总结
制作公司内部网站有哪些,内网如何建网站?
下一篇:三国天下归心虓虎连斩队玩法攻略
下一篇:三国天下归心虓虎连斩队玩法攻略


sion == nil —— 否则条件永远为 false(因为 session 是 **mgo.Session 类型,只要传入了有效地址,它自身就非 nil);