Golang MongoDB(mgo) 查找反射报错
Golang MongoDB (mgo) Find reflection error
用下面的代码
func (s Store) Lookup(department string, number string) (*types.Course, error) {
var result *types.Course
err := s.collection.Find(bson.M{
"department": department,
"course_number": number,
}).One(result)
if err != nil {
switch err {
case mgo.ErrNotFound:
return nil, ErrNotFound
default:
log.Error(err)
return nil, ErrInternal
}
}
return result, nil
}
我遇到错误:
reflect: reflect.Value.Set using unaddressable value
如果我将第一行从 var result *types.Course
更改为 result := &types.Course{}
则没有错误。这两者到底有什么区别?
这两个选项都声明了一个*types.Course
类型的变量。第一个指针值为 nil。第二个初始化为指向 types.Course
.
类型的值
var result *types.Course // result == nil
result := &types.Course{} // result != nil, points to a value.
result := new(types.Course) // basically the same as the second
mgo 函数需要一个指向值的指针。 nil 指针不指向值。
这段代码的典型写法是:
var result types.Course // declare variable of result type, not a pointer
err := s.collection.Find(bson.M{
"department": department,
"course_number": number,
}).One(&result) // pass address of value to function
用下面的代码
func (s Store) Lookup(department string, number string) (*types.Course, error) {
var result *types.Course
err := s.collection.Find(bson.M{
"department": department,
"course_number": number,
}).One(result)
if err != nil {
switch err {
case mgo.ErrNotFound:
return nil, ErrNotFound
default:
log.Error(err)
return nil, ErrInternal
}
}
return result, nil
}
我遇到错误:
reflect: reflect.Value.Set using unaddressable value
如果我将第一行从 var result *types.Course
更改为 result := &types.Course{}
则没有错误。这两者到底有什么区别?
这两个选项都声明了一个*types.Course
类型的变量。第一个指针值为 nil。第二个初始化为指向 types.Course
.
var result *types.Course // result == nil
result := &types.Course{} // result != nil, points to a value.
result := new(types.Course) // basically the same as the second
mgo 函数需要一个指向值的指针。 nil 指针不指向值。
这段代码的典型写法是:
var result types.Course // declare variable of result type, not a pointer
err := s.collection.Find(bson.M{
"department": department,
"course_number": number,
}).One(&result) // pass address of value to function