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
...
}