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成为指针