Go指针初始化

复制代码
var post *models.Post
res := postDao.SavePost(post)
复制代码
var post models.Post
res := postDao.SavePost(&post)

在1中将models.Pos声明为指针但是并没有为其分配内存空间,这意味着它的值为 nil,并且没有指向有效的 models.Post 对象。

复制代码
func Test1(t *testing.T) {
	var post *models.Post
	
	post.Id = 1
	fmt.Printf("%v", post)
}

这样访问就会出错:

复制代码
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
	panic: runtime error: invalid memory address or nil pointer dereference

第二种写法 var post models.Post 声明了一个直接的 models.Post 类型的变量,并为其分配了内存空间。然后,将 &post 作为参数传递给 SavePost 方法,将 post 变量的地址传递给了方法。

这样,SavePost 方法在使用 post 时可以访问到有效的内存空间,而不会导致内存错误。

如果想用第一种让post是一个指针变量并且有空间,应该这样写

复制代码
post := &models.Post{}
res := postDao.SavePost(post)

models.Post{}创建了一个新的对象,这个对象在内存空间,&将地址赋予给post,post成为指针

相关推荐
小码哥_常2 小时前
别再被误导!try...catch性能大揭秘
后端
南境十里·墨染春水3 小时前
C++传记(面向对象)虚析构函数 纯虚函数 抽象类 final、override关键字
开发语言·c++·笔记·算法
无巧不成书02183 小时前
30分钟入门Java:从历史到Hello World的小白指南
java·开发语言
2301_797172753 小时前
基于C++的游戏引擎开发
开发语言·c++·算法
苍何4 小时前
30分钟用 Agent 搓出一家跨境网店,疯了
后端
ssshooter4 小时前
Tauri 2 iOS 开发避坑指南:文件保存、Dialog 和 Documents 目录的那些坑
前端·后端·ios
追逐时光者4 小时前
一个基于 .NET Core + Vue3 构建的开源全栈平台 Admin 系统
后端·.net
程序员飞哥4 小时前
90后大龄程序员失业4个月终于上岸了
后端·面试·程序员
比昨天多敲两行4 小时前
C++ 二叉搜索树
开发语言·c++·算法
Birdy_x5 小时前
接口自动化项目实战(1):requests请求封装
开发语言·前端·python