Неверный адрес памяти или разыменование нулевого указателя, когда база данных возвращает пустой набор

Когда я передаю идентификатор события в DisplayScanMembers (23), если event_id не отображается в базе данных, он возвращает пустой набор. Однако, по-видимому, пустой набор эквивалентен нулевому указателю (я думаю). Поэтому я не могу присвоить значение (указатель nil) элементу member_s в функции DisplayScanMembers.

Все, что мне нужно, это чтобы метод getScanMembers возвращал пустой массив вместо nil, если запрос к базе данных возвращает пустой набор.

Ошибка, которую я получаю:

ОШИБКА 22.10.2014 23:08:19 panic.go: 29: ошибка времени выполнения: неверный адрес памяти или разыменование нулевого указателя /home/developer/gocode/src/drakecheckin/app/controllers/scan.go:236 (0x4a21f8)

func (c Scan) DisplayScanMembers(id int64) revel.Result{

if (id == -1 || id == 0){ 
    event,_ :=c.getLatestSelectedEvent();
    member_s,_ := c.getScanMembers(event.EventId);
    return members;
} else { 
    member_s,err2 := c.getScanMembers(id);
    if err2 !=nil {
                event,_ :=c.getLatestSelectedEvent();
                member_s,_ = c.getScanMembers(event.EventId);
    }
    return member_s;
}

}


func (c Scan) getScanMembers(event_id int64) (revel.Result,error) {

group_id,_ := convStrInt(c.Session["group_id"]);
org_id,_ := convStrInt(c.Session["org_id"]);;
query := "SELECT me.member_event_id,m.member_first_name,m.member_last_name,m.member_uniq_num "+
          "FROM MemberEvent AS me JOIN Member AS m ON m.member_id =me.member_id AND m.org_id =me.org_id "+
          "WHERE me.group_id=? AND me.org_id=? AND me.event_id=?"; 

members, err := c.Txn.Select(models.AllMemberEvent{}, query, group_id, org_id, event_id);
if err != nil {
    return nil,err;
}

return c.RenderJson(members),nil;

}

person WarrenV    schedule 23.10.2014    source источник
comment
... возможно, я не совсем понимаю вашу проблему ... но я предполагаю, что вы пробовали if members == nil { members = []models.AllMemberEvent{} } перед тем, как вернуться?   -  person Simon Whitehead    schedule 23.10.2014
comment
Если запрос возвращает пустой набор, вместо members = [] он говорит (0x4a2088). Я хочу, чтобы у него был member = [] not (0x4a2088).   -  person WarrenV    schedule 23.10.2014
comment
Это указатель. Установите ссылку: *members = []models.AllMemberEvent{} (обратите внимание на звездочку)   -  person Simon Whitehead    schedule 23.10.2014


Ответы (1)


Думаю ваша проблема в функции "getScanMembers". Ваш оператор возврата - revel.Result, и если у вас есть ошибка, вы делаете это:

if err != nil {
    return nil, err;
}

Но вы должны сделать это:

if err != nil {
    return revel.Result{}, err;
}
person Oleksandr Mosur    schedule 23.01.2015