The `func check(Condition bool) {}` applies to the block that follows.
Within this block, every statement that on its left-hand side has any
variable that is present in the "Condition" expression is supplemented
with an implicit check of `if Condition { goto catch }` form.
The 'catch:' label can be given explicit, or be assumed implicit at
last statement of the block.
// Condition is not restricted to `err != nil`.
// Below snippet will `break` if x was < 4 after any of trX calls:
check(x < 4)
{
x, y = trA(x, z)
y, z = trB(x, y) // no x on lhs, no check
x, y = trC(y, z)
break
}
// `check` helps the most where many repetitive checks
// are to be performed in close proximity.
check(err != nil)
{
ucred, err := getUserCredentials(user)
remote, err := connectToApi(remoteUri)
err, session, utok := remote.Auth(user, ucred)
udata, err := session.getCalendar(utok)
catch: // sad path, err != nil
ucred.Clear() // cleanup passwords
remote.Close() // do not leak sockets
return nil, 0, // dress before leaving
fmt.Errorf("Can not get user's Calendar because of: %v", err)
}
// happy path
The proposal is at
https://github.com/golang/go/issues/32968
Please leave a comment for your possible thumb-down, as
I would like to know about flaws I do not see as the author.
Thank you,
--
Wojciech S. Czarnecki
<< ^oo^ >> OHIR-RIPE