@gogolang

Страница 1370 из 1630
Daniel
06.09.2018
16:51:58
ну это уже немного другая ситуация, совершенно разные экосистемы
ну так давайте считать go и go2 разными экосистемами, и не париться

Sergey
06.09.2018
16:52:34
ну так давайте считать go и go2 разными экосистемами, и не париться
Авторы го не хотят другой язык, если вам надо вы и делайте

Daniel
06.09.2018
16:52:59
авторы go будут делать то, что сочтут нужным

Bogdan (SirEdvin)
06.09.2018
16:53:16
ну так давайте считать go и go2 разными экосистемами, и не париться
Дробление сообщества - это существенная проблема для языка программирования, на самом деле.

Google
Daniel
06.09.2018
16:53:31
правда, если они будут тянуть обратную совместимость - будут проблемы рано или поздно

Roman
06.09.2018
16:54:25
ну так давайте считать go и go2 разными экосистемами, и не париться
кстати, как считаешь, таки будет "реальный" Go 2 в скором или его ещё, веря словам разработчиков, не будет очень долго? потому-что если они запланировали его уже на скажем следующий год то пропосал стоит адресовать на Go 2.x если же нет, то на Go 1.x с пометкой о том, как можно бы было сделать в Go 2.x ещё лучше

Sergey
06.09.2018
16:54:30
Это спор ни о чем, авторы го свое мнение озвучили, а остальное это дрочерство Ну и каждые 5 лет новую экосистему это конечно же бред

Roman
06.09.2018
16:55:58
я думаю, его не будет никогда
у меня аналогичное чувство. Поэтому таки концентрируемся на Go => 1.12

Daniel
06.09.2018
16:57:24
угу

Roman
06.09.2018
16:57:32
Это спор ни о чем, авторы го свое мнение озвучили, а остальное это дрочерство Ну и каждые 5 лет новую экосистему это конечно же бред
а что конкретно авторы озвучили? насколько я знаю они сказали лишь что "его не будет ещё очень долгое время, потому-что у нас Go 1 compatibility promise"

я не знаю как авторы определяют "очень долгое время", может для них год это уже очень долго... хотя с итерациями в пол-года конечно можно предположить что это наверное лет эдак 5

Roman
06.09.2018
16:59:20
Насколько я помню Истории а-ля питон 2/3 не будет и го 2 это где то го 1.15-1.16
да, я вкурсе, поэтому пропосал и пишу исходя из Go => 1.12

поэтому - иммутабельности всего по умолчанию и ключевого слова mut, увы - не быть

Google
Pawel
06.09.2018
17:07:56
правда, если они будут тянуть обратную совместимость - будут проблемы рано или поздно
что значит "если"? они постоянно подчёркивают, что ничего ломать не будут точно

Daniel
06.09.2018
17:08:48
это просто мое мнение, ни на что не влияющее :)

Roman
06.09.2018
17:16:44
поэтому ради общего блага я пока-что решил использовать менее ограничивающий, но более громоздкий вариант, когда указатель или slice отдельно от объекта анотируется на (и)мутабельность worst case: const map[const * const Object] const * const Object иммутабельный мап, с иммутабельным указателем на иммутабельный объект в качестве ключа на иммутабельный указатель на иммутабельный объект если кому-то данная тема интересна то буду рад обсудить аргументы за упрощённый, но ограничивающий вариант
В таком случае получается: // Immutable pointer to mutable object var immut2mut const *Object = &Object{} immut2mut = &Object{} // violation! immut2mut.Field = 42 // fine immut2mut.Mutation() // fine /*--------*/ // Mutable pointer to immutable object var mut2immut * const Object = &Object{} mut2immut = &Object{} // fine mut2immut.Field = 42 // violation! mut2immut.Mutation() // violation! /*--------*/ var immut2immut const * const Object = &Object{} immut2immut = &Object{} // violation! immut2immut.Field = 42 // violation! immut2immut.Mutation() // violation! тоже самое касается контейнеров: // Immutable slice of immutable objects var immut2immut const [] * const Object immut2immut = append(immut2immut, Object{}) // violation! immut2immut[0] = Object{} // violation! p1 := immut2immut[0] p1.Mutation() // violation! /*--------*/ // Mutable slice of immutable objects var mut2immut [] * const Object mut2immut = append(mut2immut, Object{}) // fine mut2immut[0] = Object{} // fine p2 := mut2immut[0] p2.Mutation() // violation! /*--------*/ // Immutable slice of mutable objects var immut2mut const [] *Object immut2mut = append(immut2mut, Object{}) // violation! immut2mut[0] = Object{} // violation! p2 := immut2mut[0] p2.Mutation() // fine /*--------*/ // Mutable slice of mutable objects var mut2mut [] *Object mut2mut = append(mut2mut, Object{}) // fine mut2mut[0] = Object{} // fine p2 := mut2mut[0] p2.Mutation() // fine

Pawel
06.09.2018
17:23:00
Поповоду const объектов. Вот допустим их таки добавят (хотя шансов нет, аналогичных предложений много висит, их игнорят). Вроде бы всё гут, но я лично вижу в этом две проблемы 1. Эстетическая. Добавится писанины, const будет по всюду, и выглядеть это будет как Rust 2. Перформанс. Появится возможность писать неэффективные функции вида "получить const-объект - вернуть модифицированный"

Pawel
06.09.2018
17:26:52
Поповоду const объектов. Вот допустим их таки добавят (хотя шансов нет, аналогичных предложений много висит, их игнорят). Вроде бы всё гут, но я лично вижу в этом две проблемы 1. Эстетическая. Добавится писанины, const будет по всюду, и выглядеть это будет как Rust 2. Перформанс. Появится возможность писать неэффективные функции вида "получить const-объект - вернуть модифицированный"
в языках с ленивостью и персистентностью копии в таких случаях не создаются (теоретически, практически конечно же все структуры данных плоские и копии таки создаются). А в Го так нельзя, и придётся всё копировать. А думать о том, делать ли объект стразу же на этапе проектирования константным - лень. Рефакторить тип из константности в мутабельность или обратно - тоже лень. В итоге получим много классического говнокода

2? Вообще-то в copy-on-write и смысл ? А где надо можно и не писать const.
я точно не знаю где надо и где не надо. и это завтра скорее всего изменится

Roman
06.09.2018
17:28:26
Поповоду const объектов. Вот допустим их таки добавят (хотя шансов нет, аналогичных предложений много висит, их игнорят). Вроде бы всё гут, но я лично вижу в этом две проблемы 1. Эстетическая. Добавится писанины, const будет по всюду, и выглядеть это будет как Rust 2. Перформанс. Появится возможность писать неэффективные функции вида "получить const-объект - вернуть модифицированный"
1. Эстетика против безопасности… То что в код может прокрасться баг, который может стоить бизнес серьёзные деньги и на который ты потратишь часы дебажа и кучу нервов - это пустяки. Главное код красивый ? 2. Performance это immutabilit станет только лучше, уйдёт ненужное копирование + можно будет строить оптимизации основанные на иммутабельности. P.S. быть с точки зрения похожим на Rust это разве плохо? (не с точки зрения синтаксиса и эстетики)

Pavel
06.09.2018
17:28:44
но в моей практике обычно код и горячие циклы в приложении статичны очень долго после фазы активной разработки

ты добавляешь новый функционал, но редко делаешь большие рефакторинги

Pawel
06.09.2018
17:30:27
как и завтра твой код может стать ненужным
но не весь. частично он мне скорее всего пригодится. и вот такие вещи как const серьёзно усложнят рефакторинг.

Pavel
06.09.2018
17:31:35
и часто ты рефакторишь прям с руки типа много чего переписать за раз? что у тебя прям архитектура приложения меняется?

это просто вопрос, не имеет отношения к const, мне const не нравится тоже -- слишком долго писать const const const

Roman
06.09.2018
17:33:06
shared state, это, ребята, сложно. shared state, это опасно. но shared state, это часто производительнее и порой практически неизбежимо так вот чтоб сделать shared state - менее опасным, нужна compiler-enforced иммутабельность

Daniel
06.09.2018
17:37:02
на счёт серёзных багов я не уверен совсем. Ни разу не сталкивался на практике. Были какие-то казусы и очепятки, но и только
это очень редкий баг, но один из самых трудных его трудно заметить его трудно идентифицировать его бывает очень трудно исправить

Google
Pawel
06.09.2018
17:37:47
один только pointer aliasing чего стоит.
но это больше к самоконтролю относится, чем к переиспользованияю кода. Безопасный код, в котором кишки изолированы, несколько сложнее писать, зато значительно проще читать - ну так это самый что ни на есть Go way. Поясню. Не все типы из пакета входят в апи модуля. Те немногие, которые входят, надо сделать безопасными, скрыть все слайсы, мапы и пйнтеры, изолировать нужные методы. Такой код читать на много проще, чем АПИ с константными объектами

Daniel
06.09.2018
17:38:19
коллега

вы с каким тезисом спорите

Pawel
06.09.2018
17:38:48
Pavel
06.09.2018
17:38:52
это очень редкий баг, но один из самых трудных его трудно заметить его трудно идентифицировать его бывает очень трудно исправить
а какой процент трудных багов предотвратило бы обкладывание констами в вашем опыте за последние года два?

Pavel
06.09.2018
17:39:45
константы != иммутабельные символы
там не написано константы

Roman
06.09.2018
17:40:07
там не написано константы
действительно, извиняюсь

Pawel
06.09.2018
17:40:14
Aleksandr
06.09.2018
17:40:14
Забавное из комментов: Наполовину офтоп, но раз уж речь зашла о го и оптимизациях, недавно разработчики решили выпилить ассемблерные версии алгоритма шифрования RC4 (ибо алгоритм слабый, а поддерживать ассемблер не хочется). После бенчмарков оказалось, что нынче код на го быстрее того ассемблера, что использовался в пакете. На треть.

Pavel
06.09.2018
17:41:07
действительно, извиняюсь
Роман ну вы тоже можете ответить про свой опыт ?

Pawel
06.09.2018
17:41:32
Вот кстати годный пропозал в плане добавления тру иммутабельности если кто не в курсах https://docs.google.com/document/d/1UKu_do3FRvfeN5Bb1RxLohV-zBOJWTzX0E8ZU1bkqX0/edit#heading=h.2wzvdd6vdi83

Pawel
06.09.2018
17:42:08
тут я зв обеими руками

это очень редкий баг, но один из самых трудных его трудно заметить его трудно идентифицировать его бывает очень трудно исправить
и опять пришли к делеме "настваить кодеру палок в колёса дабы не накосячил". В случае с const - самому себе

Mike
06.09.2018
17:43:46
Лёгкий оффтоп на тему: с тех пор как в js появились лет и конст, га практике 90% переменных стали конст, и рука уже на автомате их так объявляет, и многие баги прям по ходу написания улавливаются так.

и опять пришли к делеме "настваить кодеру палок в колёса дабы не накосячил". В случае с const - самому себе
Ты чё, наставлять кодеру палки в колеса -- это охуенно. Чем больше ограничений, тем более предсказуем код становится

Pavel
06.09.2018
17:44:57
??

Mike
06.09.2018
17:45:28
но использовать const или нет -- это не ограничение, это еще один выбор
Ограничение. Один раз заюзал -- и вот твоя переменная ограничена

И дальше ты уверен, что ее не поменяют => предсказуемость

Google
Mike
06.09.2018
17:46:42
(для прояснения -- из всех языков, на которых я писал, самый любимый -- кложурка)

Pawel
06.09.2018
17:46:42
Ты чё, наставлять кодеру палки в колеса -- это охуенно. Чем больше ограничений, тем более предсказуем код становится
тебе бы на хаскилях и растах пописать чтобы ты понял насколько это действительно охуенно.

Pavel
06.09.2018
17:46:45
Ограничение. Один раз заюзал -- и вот твоя переменная ограничена
А один раз не заюзал -- и вот снова тлен и безысходность....

Mike
06.09.2018
17:47:33
Но медленно писалось, так что в прод не тащу пока

Roman
06.09.2018
17:50:59
а какой процент трудных багов предотвратило бы обкладывание констами в вашем опыте за последние года два?
я не смогу спонтанно перечислить конкретные случаи за последние пару лет, надо вспоминать. Но я могу с уверенно сказать что эти проблемы были самыми грязными и стабильно портили настроение, потому-что дебажить их то ещё удовольствие! я вам дам аналогию для более простого понимания: зачем нам в Go int32 и int64? Если Go это про простоту, то зачем усложнять и просто не оставить int а там пускай компилятор решает где это 32 а где 64 bit. Причина на то имеется, и она называется integer overflow и все вы её прекрасно знаете. так вот если бы мы не смогли предсказать, где 64 а где 32, то очень легко можно бы было придти к неверным вычислениям, и сразу этого не заметить, а потом потерять из-за этого кучу бабла, реального, зелёного, когда 2,147,483,647 вдруг превратится в 4200, хотя код компилируется и работает. С pointer aliasing’ом проблема такая-же. Код компилируется, а программа выдаёт бредовые результаты и хер пойми почему, особенно когда не ты один работал над кодом да ещё и возможно со сторонними библиотеками. зачем нам типизация? да для того чтоб работать в команде было легче, чтоб кто-нибудь по невнимательности не передал слона в жирафа. А иммутабельность это всё эщё про систему типов, она просто ещё более конкретизирут типы раздeляя их на мутабельные и немутабельные, для того, чтоб кто нибидь случайно не оторвал нашему слону хобот, там, где ожидается полноценый слон

Pawel
06.09.2018
17:51:18
Карч я пожытожу свою мыслю, ок? const * const: - задолбёшся писать - задолбёшся читать - рано или поздно напорешься на тормоза с копированием как в C++ - в плане бонусов и плюшек получишь в итоге пшик

Daniel
06.09.2018
17:53:02
так, все, я здолбался колеги, сворачиваем дискуссию pawel может голосовать против, если пропозал доберется до голосования

Admin
ERROR: S client not available

Pavel
06.09.2018
17:53:39
я не смогу спонтанно перечислить конкретные случаи за последние пару лет, надо вспоминать. Но я могу с уверенно сказать что эти проблемы были самыми грязными и стабильно портили настроение, потому-что дебажить их то ещё удовольствие! я вам дам аналогию для более простого понимания: зачем нам в Go int32 и int64? Если Go это про простоту, то зачем усложнять и просто не оставить int а там пускай компилятор решает где это 32 а где 64 bit. Причина на то имеется, и она называется integer overflow и все вы её прекрасно знаете. так вот если бы мы не смогли предсказать, где 64 а где 32, то очень легко можно бы было придти к неверным вычислениям, и сразу этого не заметить, а потом потерять из-за этого кучу бабла, реального, зелёного, когда 2,147,483,647 вдруг превратится в 4200, хотя код компилируется и работает. С pointer aliasing’ом проблема такая-же. Код компилируется, а программа выдаёт бредовые результаты и хер пойми почему, особенно когда не ты один работал над кодом да ещё и возможно со сторонними библиотеками. зачем нам типизация? да для того чтоб работать в команде было легче, чтоб кто-нибудь по невнимательности не передал слона в жирафа. А иммутабельность это всё эщё про систему типов, она просто ещё более конкретизирут типы раздeляя их на мутабельные и немутабельные, для того, чтоб кто нибидь случайно не оторвал нашему слону хобот, там, где ожидается полноценый слон
ну во первых компилятор может всегда делать int64, во вторых как-то скучно я живу, что у меня за два года не было ни одного такого бага ?

Daniel
06.09.2018
17:54:29
у меня был в 2015 один такой, я его неделю ловил

и в 2018 тоже, но тут мне помогло то, что оно иногда падало по конкурентной модификации мапы

Pavel
06.09.2018
17:55:18
профит от const -- перформанс для оптимизаций компилятором, но компилятор в го по сравнению с c++ -- практически не умеет в оптимизации все равно

да и в Java JIT без final как-то нормально живет

Daniel
06.09.2018
17:55:36
он учится, и довольно быстро

Pavel
06.09.2018
17:55:59
он учится, и довольно быстро
я не говорил что он стоит на месте

Roman
06.09.2018
17:56:19
1.2. Benefits https://github.com/romshark/Go-2-Proposal---Immutability#12-benefits

Pavel
06.09.2018
17:58:23
1.2. Benefits https://github.com/romshark/Go-2-Proposal---Immutability#12-benefits
для меня только 1.2.3 релевантно сейчас, может что-то поменяется в будущем =)

но я верю, что компилятор может быть лучше и без const =)

Google
Daniel
06.09.2018
17:59:35
давайте про компилятор забудем пока

Roman
06.09.2018
17:59:36
для меня только 1.2.3 релевантно сейчас, может что-то поменяется в будущем =)
значит вы ещё недостаточно глубоко спустились в кроличью нору, а там страшно, я там был, но вам мне не обязательно верить

Pavel
06.09.2018
18:00:00
ну я говорю что скучновато живу

Pawel
06.09.2018
18:04:55
и в 2018 тоже, но тут мне помогло то, что оно иногда падало по конкурентной модификации мапы
два случая - это не то чтобы ах. У других людей наверное меньше. Вот у меня например - 0 :) Может есть и другие способы предотвращения таких случаев? например, делать маленькие пакеты, в которых изолировать слайсы/мапы, передаваемые/получаемые методами.

Daniel
06.09.2018
18:05:50
еще раз - вы с каким тезисом спорите?

Pavel
06.09.2018
18:08:11
еще раз - вы с каким тезисом спорите?
вроде человек про свой опыт только что рассказал ? как и вы пару минут назад

Daniel
06.09.2018
18:09:15
вроде человек про свой опыт только что рассказал ? как и вы пару минут назад
я на вопрос отвечал. пожалуйста, будьте внимательней

с тезисом что наддо вводить что-то типа const * const и т.п.
тогда, возможно, надо сменить аргументацию. потому как сейчас ваши аргументы мимо

Danil
06.09.2018
18:11:08
здравствуйте, подскажите как декодировать строку у меня есть строка вида \x02\xe5\x05\x07\xc0\x88\x1c~i я знаю что ее кодировали с помощью кодировки ср437, скажите как ее декодировать в читаемый формат?

Daniel
06.09.2018
18:12:31
а len у этой строки какой?

Danil
06.09.2018
18:12:57
каждый раз разная

Aleksandr
06.09.2018
18:14:24
пример

reader := bytes.NewReader(iter.Node().Bytes()) transformer := transform.NewReader(reader, charmap.Windows1251.NewDecoder()) buf, _ := ioutil.ReadAll(transformer)

Александр
06.09.2018
18:19:11
какая то мистика блин

сделал два поля в модели - *time.Time

оба форматируются в .Format(time.RFC3339)

Страница 1370 из 1630