Golang удаляет повторяющийся код при обработке возврата ошибки

Я изучаю Golang, создавая веб-приложение. При работе с Go я часто сталкивался с этой ситуацией

err = SomeFunction()

// Handling err
if err != nil {
   Logging(err)
   return err
}

В C или C++ ошибка обработки части. Я могу использовать MARCO или INLINE FUNCTION для удаления повторяющегося кода. Кто-нибудь знает, как это сделать в Голанге?


person Tino    schedule 24.08.2020    source источник
comment
Этот шаблон идиоматичен в Go, я рекомендую вам следовать этому шаблону, у каждого языка есть свои парадигмы, вы должны уважать их и следовать им.   -  person Hossein    schedule 24.08.2020
comment
Возможно, в будущем улучшится (Go2).   -  person p1gd0g    schedule 24.08.2020
comment
Два момента: 1) вы почти никогда не должны возвращать голый err обратно, а вместо этого дополнять ошибку дополнительным контекстом/деталями, например return fmt.Errorf("could not connect to database: %w", err) 2. вы либо возвращаете ошибку, либо регистрируете ее, но не и то, и другое. Так как вы все равно должны регистрировать его у самого верхнего вызывающего абонента (ваш обработчик main или http или что у вас есть)   -  person zerkms    schedule 24.08.2020
comment
@zerkms Моя идея заключается в том, что при возникновении ошибки она будет печатать ошибку от самого верхнего вызывающего объекта до его последнего дочернего элемента (например, обратная трассировка). Это лучший способ сделать это?   -  person Tino    schedule 24.08.2020


Ответы (2)


вы можете использовать https://gitlab.com/opennota/macro

определить такие макросы в input.go.tmpl

func MACRO_m1(a, b int) {
    a = b ^ 1
}

func main(){
   m1(v1, v2)
}

в командной строке

macro input.go.tmpl output.go

превратится в

func main(){
     v1 = v2 ^ 1       
}
person whitespace    schedule 24.08.2020

То, как встроенная функция работает в Go, отличается от того, как она работает в C или других языках. Компилятор Go достаточно умен, чтобы преобразовать гораздо более простые функции во встроенные функции в своем скомпилированном коде.

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

func returnFromErr(){

    // Create a anonynous function and assign it a variable
    logErr := func (err error)bool {
        if err != nil{
            logger(err)
        }
        return err != nil
    }

    err := someFunction()
    // call the function and log your error. You can avoid certain level of duplication
    if logErr(err){return}

    fmt.Println("no error")
}

func main(){
returnFromErr()

}
person Gandharva S Murthy    schedule 24.08.2020