Одиночный аргумент переноса для функции

#go #arguments

#Вперед #аргументы

Вопрос:

У меня есть 33 функции обратного вызова:

 func Cb1() {}
func Cb2() {}
func Cb3() {}
func Cb4() {}
func Cb5() {}
// other 28 callbacks ...
  

Все они должны быть переданы в одну функцию. Итак, я сделал это самым очевидным способом:

 type fn func()

func My(Cb1 fn, Cb2 fn, Cb4 fn, Cb3 fn, Cb5 fn, ... and so on ...){
   Cb1()
   Cb2()
   Cb4()
   Cb5()
}

My(Cb1, Cb2, Cb4, Cb3, Cb5, ... and so on ...)
  

Я уверен, что я не единственный, у кого болят глаза от вида этого «поезда» аргументов.

В javascript я бы просто собрал их все в класс / объект и передал их как один аргумент, например:

 function My(cb = {}){
   cb.Cb1();
   cb.Cb2();
   cb.Cb4();
   cb.Cb5();
}

My({ 
   Cb1,
   Cb2,
   Cb4,
   Cb5
});
  

Но как мы это делаем в Go?

Комментарии:

1. Вы могли бы сделать это таким же образом, обернуть их в структуру данных, такую как срез, карта или структура; или вы могли бы разобраться в основной проблеме, потому что такая ситуация действительно не должна возникать в Go. Похоже, вы пытаетесь написать JavaScript в Go, что приведет к множеству проблем и действительно сложному для чтения коду.

2. Объявить function My(cb...func()) {}

Ответ №1:

Чтобы расширить комментарий Бурака Сердара выше, я бы предложил аргументы переменных функций.

Это даст вам «мою» функцию, подобную следующей:-

 // My invokes the supplied list of callbacks
func My(cbs ...func()) {
    for _, cb := range cbs {
        cb()
    }
}
  

Вы можете увидеть это и запустить его здесь:
https://play.golang.org/p/P3xDYN-1C7M