Поскольку вы передаете функцию в качестве параметра другой функции, вы не можете контролировать способ ее вызова. Тем не менее, у вас есть полный контроль над тем, что происходит внутри функции - это означает, что вы можете запустить там программу:
func onMessageReceived(client MQTT.Client, message MQTT.Message) {
go func() {
fmt.Printf("%s\n", message.Payload())
}()
}
Таким образом, onMessageReceived
сам по-прежнему будет вызываться MQTT синхронно, но он просто запустит программу и немедленно вернется. Вы также можете определить отдельную функцию и вызвать ее с помощью go
вместо анонимной функции:
func onMessageReceived(client MQTT.Client, message MQTT.Message) {
go messageHandler(client, message)
}
func messageHandler(client MQTT.Client, message MQTT.Message) {
fmt.Printf("%s\n", message.Payload())
}
Это просто вопрос того, как вы хотите организовать свой код. Если это короткий обработчик, я бы, вероятно, придерживался анонимной функции (достаточно короткой, чтобы вы могли видеть весь анонимный функционал на одном экране); для более длинной функции я бы разбил ее или разделил на именованную функцию.
Поскольку вы не можете передавать какие-либо дополнительные параметры, если вы хотите использовать WaitGroup
, он должен быть глобальным:
var wg = new(sync.WaitGroup)
func onMessageReceived(client MQTT.Client, message MQTT.Message) {
wg.Add(1)
go func() {
defer wg.Done()
fmt.Printf("%s\n", message.Payload())
}()
}