Назначение оператора select с одним регистром в Go? - PullRequest
1 голос
/ 10 января 2020

Я читаю исходный код MicroMDM , в частности, реализацию pollCommands (https://github.com/micromdm/micromdm/blob/5c70048c14592fc16c2107f1af1bf8e0d3a52e0b/platform/queue/queue.go#L223 -L284 ):

func (db *Store) pollCommands(pubsub pubsub.PublishSubscriber) error {
    commandEvents, err := pubsub.Subscribe(context.TODO(), "command-queue", command.CommandTopic)
    if err != nil {
        return errors.Wrapf(err,
            "subscribing push to %s topic", command.CommandTopic)
    }
    go func() {
        for {
            select {
            case event := <-commandEvents:
                var ev command.Event
                if err := command.UnmarshalEvent(event.Message, &ev); err != nil {
                    level.Info(db.logger).Log("msg", "unmarshal command event in queue", "err", err)
                    continue
                }

                cmd := new(DeviceCommand)
                cmd.DeviceUDID = ev.DeviceUDID
                byUDID, err := db.DeviceCommand(ev.DeviceUDID)
                if err == nil && byUDID != nil {
                    cmd = byUDID
                }
                newPayload, err := plist.Marshal(ev.Payload)
                if err != nil {
                    level.Info(db.logger).Log("msg", "marshal event payload", "err", err)
                    continue
                }
                newCmd := Command{
                    UUID:    ev.Payload.CommandUUID,
                    Payload: newPayload,
                }
                cmd.Commands = append(cmd.Commands, newCmd)
                if err := db.Save(cmd); err != nil {
                    level.Info(db.logger).Log("msg", "save command in db", "err", err)
                    continue
                }
                level.Info(db.logger).Log(
                    "msg", "queued event for device",
                    "device_udid", ev.DeviceUDID,
                    "command_uuid", ev.Payload.CommandUUID,
                    "request_type", ev.Payload.Command.RequestType,
                )

                cq := new(QueueCommandQueued)
                cq.DeviceUDID = ev.DeviceUDID
                cq.CommandUUID = ev.Payload.CommandUUID

                msgBytes, err := MarshalQueuedCommand(cq)
                if err != nil {
                    level.Info(db.logger).Log("msg", "marshal queued command", "err", err)
                    continue
                }

                if err := pubsub.Publish(context.TODO(), CommandQueuedTopic, msgBytes); err != nil {
                    level.Info(db.logger).Log("msg", "publish command to queued topic", "err", err)
                }
            }
        }
    }()

    return nil
}

Что Меня удивляет, почему в for l oop есть оператор select с одним case. Разве этот код не был бы эквивалентен

for {
    event := <-commandEvents
    var ev command.Event
    ...
}

Мне кажется, что код можно упростить, покончив с оператором select?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...