#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