Как закрывать только текущую функцию?

Есть несколько функций. Допустим:

func Some1(w http.ResponseWriter, r *http.Request){
    err:=Some2(w,r)
    if err!=nil{
       log.Println(err)
       return
    }
    //some code
}

func Some2(w http.ResponseWriter, r *http.Request) error{
    data, err:=io.ReadAll(r.Body)
    if err!=nil{
       return err
    }
    fmt.Println(string(data))
    return nil
}

func Some3(w http.ResponseWriter, r *http.Request){
    err:= Some2(w,r)
    if err!=nil{
       log.Println(err)
       return
    }
    //some code
}

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

А как можно сделать эту проверку и завершение одной функции с помощью како-нибудь обертки? Чтобы можно было вызвать эту обертку и функция из которой обертка запущена завершалась но при этом программа оставалась запущенной.

Грубо говоря, нужно сделать функцию EndFunction(err error), которая сделает return для вызвавшей ее функции. Вот это:

if err!=nil{
       log.Println(err)
       return
    }

Запихнуть в отдельную функцию но чтобы return был для той которая эту функцию вызвала. Есть такие механизмы в го если понятно о чем я?


Ответы (1 шт):

Автор решения: Паша

Главное отличие ошибок в Go от механизма исключений в том, что вас заставляют явно их обрабатывать или игнорировать при каждом вызове функции. Кроме как с помощью panic в связки с recover вы никак не можете перепрыгнуть через несколько функций в call стеке. Т.е. такое:

чтобы return был для той которая эту функцию вызвала.

вряд ли возможно.

→ Ссылка