LINUX.ORG.RU

История изменений

Исправление kaldeon, (текущая версия) :

Тут тоже можно предложить другое решение:

func(g func()) {
    start := 0
    g()
    end := 42
    fmt.Println(end - start)
}(func() {
    // war and peace
})

На практике я такие чудеса ещё не писал. Выглядит странновато.

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

Если же использовать мой пример, то при панике строчки в логе не будет. Это тоже вводит в заблуждение, но в отличие от 0 мы сможем отследить логику программы по коду: если control flow не сходится (не приводит нас к обходу логирования), вывод один - паника.

Исправление kaldeon, :

Тут тоже можно предложить другое решение:

(func(g func()) {
    start := 0
    g()
    end := 42
    fmt.Println(end - start)
})(func() {
    // war and peace
})

На практике я такие чудеса ещё не писал. Выглядит странновато.

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

Если же использовать мой пример, то при панике строчки в логе не будет. Это тоже вводит в заблуждение, но в отличие от 0 мы сможем отследить логику программы по коду: если control flow не сходится (не приводит нас к обходу логирования), вывод один - паника.

Исправление kaldeon, :

Тут тоже можно предложить другое решение:

(func(g func()) {
    start := 0
    g()
    end := 42
    fmt.Println(end - start)
})(func() {
    // war and peace
})

На практике, конечно, я такие чудеса ещё не писал. Выглядит странновато.

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

Если же использовать мой пример, то при панике строчки в логе не будет. Это тоже вводит в заблуждение, но в отличие от 0 мы сможем отследить логику программы по коду: если control flow не сходится (не приводит нас к обходу логирования), вывод один - паника.

Исправление kaldeon, :

Тут тоже можно предложить другое решение:

f := func(g func()) {
    start := 0
    g()
    end := 42
    fmt.Println(end - start)
}
f(func() {
    // war and peace
})

На практике, конечно, я такие чудеса ещё не писал. Выглядит странновато.

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

Если же использовать мой пример, то при панике строчки в логе не будет. Это тоже вводит в заблуждение, но в отличие от 0 мы сможем отследить логику программы по коду: если control flow не сходится (не приводит нас к обходу логирования), вывод один - паника.

Исправление kaldeon, :

Тут тоже можно предложить другое решение:

f := func(g func()) {
    start := 0
    g()
    end := 42
    fmt.Println(end - start)
}
f(func() {
    // war and peace
})

На практике, конечно, я такие чудеса ещё не писал. Выглядит странновато.

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

Если же использовать мой пример, то при панике строчки в логе не будет. Это тоже вводит в заблуждение, но в отличие от 0 мы сможем отследить логику программы по коду: если control flow не сходится, вывод один - паника.

Исходная версия kaldeon, :

Тут тоже можно предложить другое решение:

f := func(g func()) {
    start := 0
    g()
    end := 42
    fmt.Println(end - start)
}
f(func() {
    // war and peace
})

На практике, конечно, я такие чудеса ещё не писал. Выглядит странновато.

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

Если же использовать мой пример, то строчки в логе не будет. Это тоже вводит в заблуждение, но в отличие от 0 мы сможем отследить логику программы по коду: если control flow не сходится, вывод один - паника.