Выполнить несколько условных функций в Голанге - PullRequest
0 голосов
/ 20 февраля 2019

Я хотел бы запустить функции рабочего процесса, используя 5 функций в golang

  1. init
  2. validate
  3. process
  4. execute
  5. finalize

Каждый метод должен возвращать один и тот же объект результата и объект ошибки в случае сбоя

Я бы хотел найти шаблон для запуска этого рабочего процесса, а не делать следующее:

if result, err := init(); err != nil {
    if result, err := validate(); err != nil {
       if result, err := process(); err != nil {
           if result, err := execute(); err != nil {
               if result, err := finalize(); err != nil {

               }
           }
       }
    }
}

Заранее спасибо Петр

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Вы можете создать часть функций и сделать весь этот процесс более красивым, например,

functions := []func() (string, error){
    function1, function2, function3, function4, function5,
}
for _, function := range functions {
    someValue, err := function()
    if err != nil {
        fmt.Println("Function " + someValue + " didn't feel so good.")
        break
    }
    fmt.Println("Function " + someValue + " went all right!")
}

Короче говоря, перерыв не позволяет вещам продолжаться, если вы закроете вышеуказанный процесс как функцию, вы можететакже используйте что-то вроде

return false

в случае ошибки, и в конце общего количества итераций, скажем, i == len (functions) -1, вы можете вернуть true, если все прошло хорошо.

Следует отметить, что вы можете создавать только те функции, которые удовлетворяют следующим условиям:

  • Все они должны иметь одинаковое количество аргументов;

  • Все аргументы должны иметь одинаковый тип для каждой позиции;

  • Все они имеют одинаковое количество возвращаемых значений;

  • Аналогично, они (возвращаемые значения) должны иметь одинаковый тип для каждой позиции;

Тем не менее, вы можете легко преодолеть эти ограничения, имея два или три разных среза.Например, все функции с 1 по 3 могут быть классифицированы как

func () (bool, err)

Где функции 4 и 5

func () (int, err)

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

firstSetOfFuncs := []func() (bool, error){
    function1, function2, function3,
}
secondSetOfFuncs := []func() (int, err){
    function4, function5,
}
for i, function := range firstSetOfFuncs {
    someValue, err := function()
    if err != nil {
        fmt.Println("Something went terribly wrong.")
        break
    }
    if i == len(firstSetOfFuncs) - 1 {
        for _, secondTypeOfFunc := range secondSetOfFuncs {
            someNum, anotherErr := secondTypeOfFunc()
            if anotherErr != nil {
                fmt.Println("All seemed all right, until it didn't.")
                break
            }
        }
    }
}
0 голосов
/ 21 февраля 2019

Как я уже сказал в комментарии, я думаю, что самым идиоматическим способом было бы просто вызвать метод, проверить на наличие ошибок.И если произошла ошибка, верните ее.Конечно, вы можете использовать упрощенную версию обработки ошибок, как вы использовали в своем вопросе, но даже если вы это сделаете.Старайтесь избегать этого глубокого вложения .Трудно читать и понимать (глубоко) вложенный код.

result,err := init()
if err != nil {
  return nil, err // An error occured so handle it
}

result,err = validate()
if err != nil {
  return nil, err
}


result,err = process()
if err != nil {
  return nil, err
}


result,err = execute()
if err != nil {
  return nil, err
}

result,err = finalize()
if err != nil {
  return nil, err
}

Проблемы вашего примера кода

Вы ошиблись в проверке ошибок.Вы проверяете

, если err! = Nil

Говорят "если есть ошибка".И вы продолжаете свой код, хотя есть ошибка.

Чтобы исправить это, вам нужно написать:

var result someType

if result, err := init(); err != nil {
  return nil, err // An error occured so handle it
}

if result, err := validate(); err != nil {
  return nil, err
}


if result, err := process(); err != nil {
  return nil, err
}

if result, err := execute(); err != nil {
  return nil, err
}

if result, err := finalize(); err != nil {
  return nil, err
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...