Golang указать спецификацию - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь найти лучший способ поиска в массиве Stuct для получения определенного c элемента с идентификатором элемента.

type Device struct {
    Addr        net.Addr
    AssignedId  int
    Data        string
}

type RegistredDevices struct {
    AllDevices      []Device
}

Сейчас я делаю это

var currentDevice models.Device
for _, device := range registredDevices.AllDevices {
    if device.AssignedId == id{
        currentDevice = device
        }
}

Я ожидал сделать что-то лучше для поиска, но я не знаю, что делать, если предмет не может быть найден. Какой должен быть возврат? Могу ли я вернуть ноль или мне нужно вернуть пустое устройство?

func (registerDevice *RegistredDevices) GetById(id int) Device{
for _, device := range registerDevice.AllDevices {
    if device.AssignedId == id{
        return device
    }
    else{
       return ?????
    }
}
}
var currentDevice = registredDevices.GetById(1)

1 Ответ

1 голос
/ 14 апреля 2020

Чтобы указать, что элемент не найден, вы можете либо вернуть указатель на элемент (который будет nil, если не найден), либо использовать два возвращаемых значения с ошибкой или логическое значение.

Например, поиск по карте возвращает пару value, ok. Пример из spe c:

Индексное выражение на карте a типа map [K] V, используемое при назначении или инициализации специальной формы

v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]

дает дополнительное нетипизированное логическое значение. Значение ok равно true, если ключ x присутствует на карте, и false в противном случае.


В вашем случае это будет:

func (registerDevice *RegistredDevices) GetById(id int) (Device, bool) {
    for _, device := range registerDevice.AllDevices {
        if device.AssignedId == id {
            return device, true
        }
    }
    return Device{}, false
}

А затем:

if currentDevice, ok := registredDevices.GetById(1); ok {
    // found. use currentDevice
} else {
    // not found
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...