Go中只有一个大小写的select语句的用途?

Go中只有一个大小写的select语句的用途?,go,concurrency,Go,Concurrency,我正在阅读的源代码,特别是pollCommands()的实现: 在我看来,删除select语句可以简化代码?是的,代码是等效的。单格select相当于直接从频道读取。为了对代码作者仁慈,可能最初有更多的案例,或者有计划添加更多的案例。(否则,最规范的编写方法可能是for event:=range commandEvents)是的,代码是等效的。单案例选择相当于直接从频道读取。为了对代码作者有利,可能最初有更多的案例,或者有计划添加更多案例。(否则最规范的编写方法可能是for event:=ran

我正在阅读的源代码,特别是
pollCommands
()的实现:


在我看来,删除
select
语句可以简化代码?

是的,代码是等效的。单格select相当于直接从频道读取。为了对代码作者仁慈,可能最初有更多的案例,或者有计划添加更多的案例。(否则,最规范的编写方法可能是
for event:=range commandEvents
)是的,代码是等效的。单案例选择相当于直接从频道读取。为了对代码作者有利,可能最初有更多的案例,或者有计划添加更多案例。(否则最规范的编写方法可能是
for event:=range commandEvents
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 {
    event := <-commandEvents
    var ev command.Event
    ...
}