Golang MongoDB(mgo)查找反射错误

eha*_*enr 2 go mongodb mgo

使用以下代码

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
}
Run Code Online (Sandbox Code Playgroud)

我遇到了错误:

reflect: reflect.Value.Set using unaddressable value
Run Code Online (Sandbox Code Playgroud)

如果我更改从第一行var result *types.Courseresult := &types.Course{}没有错误.这两者究竟有什么区别?

Cer*_*món 6

这两个otions都声明了一个类型的变量*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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)