Size: a a a

2020 April 13

ss

santiago s in Go-go!
x-foby
Когда вы заводите константу, например числовую (или любую другую примитивную), то компилятор в процессе компиляции просто подставляет в те места, где вы константу использовали, её примитивное значение. То есть в рантайме константы как таковой не существует. В этом и особенность констант (не только в Go).
А если вы хотите использовать ошибку, то вы должны определить тип, реализовать у него метод Error() string, чтоб он удовлетворял интерфейсу error, и потом создать что-то этого типа. И вот это что-то нельзя вычислить на этапе компиляции. Реальное вычисление значений возможно только в рантайме, а значит это уже по определению переменная.

Возможно, не совсем понятно объяснил, конечно, но в общих чертах как-то так.
есть три вида ошибок в го

1. неизвестное нечто return errors.New("error"
2. ошибка как заданная переменная var ErrSomething = errors.New("something")
3. свои типы ошибок со стейтом

и вот 2. - можно использовать для этого константы. почему нет?
источник

DP

Daniel Podolsky in Go-go!
интересно, что стандартная ошибка вполне могла бы быть константой, но не может: https://golang.org/src/errors/errors.go?s=1875:1902#L48
источник

DP

Daniel Podolsky in Go-go!
santiago s
есть три вида ошибок в го

1. неизвестное нечто return errors.New("error"
2. ошибка как заданная переменная var ErrSomething = errors.New("something")
3. свои типы ошибок со стейтом

и вот 2. - можно использовать для этого константы. почему нет?
а от 1 надо избавляться (и я даже сделал линтер соответствующий)
источник

x

x-foby in Go-go!
Слушайте, вы сейчас для меня Америку открыли, правда.
Раньше ведь это не работало. Я проверял, смотрел во что собираются константы, а теперь вот оно как?!
источник

ss

santiago s in Go-go!
Daniel Podolsky
а от 1 надо избавляться (и я даже сделал линтер соответствующий)
да, но это в идеале, а он недостижим
источник

DP

Daniel Podolsky in Go-go!
x-foby
Слушайте, вы сейчас для меня Америку открыли, правда.
Раньше ведь это не работало. Я проверял, смотрел во что собираются константы, а теперь вот оно как?!
это работало всегда
источник

ss

santiago s in Go-go!
x-foby
Слушайте, вы сейчас для меня Америку открыли, правда.
Раньше ведь это не работало. Я проверял, смотрел во что собираются константы, а теперь вот оно как?!
раньше не было errors.Is errors.As
источник

x

x-foby in Go-go!
santiago s
раньше не было errors.Is errors.As
Ну это да, но я почему-то был уверен, что и ошибку константой нельзя было объявить.
источник

IS

Ilya Sinelnikov in Go-go!
Так лучше не делать - https://play.golang.org/p/M3KmJtofFoS
источник

x

x-foby in Go-go!
Ой, блин, я чего-то туплю после всего этого.
Это, конечно, будет работать, это же примитив.
Я чего-то не обратил внимания, и подумал, что вы через errors.New(...) объявляли.

Да, согласен полностью. Очень хорошая идея в таком формате исползовать константы.
источник

IS

Ilya Sinelnikov in Go-go!
Ilya Sinelnikov
Так лучше не делать - https://play.golang.org/p/M3KmJtofFoS
Идея Чейни заменить ошибки строками имеет проблемы типа таких, и на практике может очень сильно выстрелить
источник

ss

santiago s in Go-go!
Ilya Sinelnikov
Так лучше не делать - https://play.golang.org/p/M3KmJtofFoS
ну так у вас ошибки одинаковые)
да, такое возможно, но это сильно притянутая проблема
источник

x

x-foby in Go-go!
Ну вот это как раз по той причине, что выше описана: константа должна быть вычислена на этапе компиляции, а errors.New(...) это уже рантайм.
источник

IS

Ilya Sinelnikov in Go-go!
santiago s
ну так у вас ошибки одинаковые)
да, такое возможно, но это сильно притянутая проблема
У меня ошибки типа разные, но на самом деле одинаковые. Если бы это были неконстанты, то они были бы разные.
источник

IS

Ilya Sinelnikov in Go-go!
И проблема не притянутая совсем. Но up to you конечно.
источник

ss

santiago s in Go-go!
Ilya Sinelnikov
У меня ошибки типа разные, но на самом деле одинаковые. Если бы это были неконстанты, то они были бы разные.
я сейчас про суть ошибки, если у вас есть ошибка "Something Bad" и "Something Bad" да еще и в одном пакете, то это одинаковая ошибка
источник

IS

Ilya Sinelnikov in Go-go!
santiago s
я сейчас про суть ошибки, если у вас есть ошибка "Something Bad" и "Something Bad" да еще и в одном пакете, то это одинаковая ошибка
я могу разнести эти ошибки в разные пакеты, будет та же самая паника
источник

ss

santiago s in Go-go!
Ilya Sinelnikov
И проблема не притянутая совсем. Но up to you конечно.
да, это как раз понятно, я и пытаюсь понять какие минусы у ошибок-констант
источник

IS

Ilya Sinelnikov in Go-go!
а поклэшится в тексте ошибки - как нефиг сделать
источник

ss

santiago s in Go-go!
Ilya Sinelnikov
а поклэшится в тексте ошибки - как нефиг сделать
ну ок, наверное это аргумент, хотя если в ошибках использовать имя пакета, то все решается
источник