All streams
Search
Write a publication
Pull to refresh
0
0
Send message
Так вот, оказывается, какой он — способ написать свой первый пост про Go, оставшись при этом в плюсе!
Не надо ничего проверять. Это делает компилятор — для кода, относящегося к текущей goroutine, расставляет в местах инструкций для процессора переход по условию на точку входа в блок catch. Чуть выше я написал как именно он это делает.
Хороший вопрос.
Я бы не ловил в данном случае. То есть catch ловит только внутри текущей goroutine.
Немного потеоритезирую, но в случае имплементации моей версии try...catch компилятор после каждого присвоения нового значения указанным после try переменным типа error — сразу после того, как записал их значение (коим является 64-битный адрес объекта ошибки) в память, но до того, как вытеснил это значение из регистра — просто смотрит, является ли значение в регистре отличным от нуля. Если да — следует простой переход в блок catch, а все нужные значения при этом уже находятся на своих местах. Никаких других накладных расходов, вроде, не предвидится. Не думаю, что в данном варианте логики производительность сильно пострадает. Всего лишь одна проверка регистра на 0.

Полноценное исключение, насколько я его понимаю, является гораздо более масштабным мероприятием.
Go не даёт выбора.

Для указанного случая — как раз таки даёт «из коробки». Только вместо try в main или транзакцию снизу кидается panic, которую наверху ловят через defer/recover.
В данном конкретном случае областью видимости rows будет блок if/else. Не всегда это удобно.
Главный вопрос в ловле panic — производительность. Мне кажется, она тут страдает.
Это заметка о «фиче» которая не помешала бы лично мне. Как минимум ещё 9 человек со мной согласились — день прожит не зря.
как мне кажется, уж лучше использовать наработанные стереотипы от других языков

Если ловить исключения, и делать это так, чтобы было максимально похоже на другие языки — возможно, но смысл конструкции с объявлением переменных сразу после try в том, что там происходит их инициализация. В противном случае мы в catch можем искать переменные, которые не инициализированы — до них просто очередь не дошла.

Ну это, конечно, если не ломать сам подход к обработке ошибок. Если ломать — придётся устроить большой холивар на тему «в какую сторону» и «нужно ли». И мне почему-то кажется, что за «ломать» будут в первую очередь те, кто на Go не пишут, а большинство среди тех, кто будет «против» — использует этот язык ежедневно.
2

Information

Rating
Does not participate
Location
Россия
Registered
Activity