Roman
почему нельзя просто const a = []int{1,2,3}?
потому-что это transitive immutabiliy, который я уже упоминал только-что, читайте тут
Zver
потому-что это transitive immutabiliy, который я уже упоминал только-что, читайте тут
В скольки процентах операций потребуется что-то сложнее этого: const a = []int{1,2,3}?
Roman
а если я хочу типа матрицу то mut [] mut [] mut * mut T ?
скорее mut [] mut [] * mut T, нет смысла делать указатель мутабельным. для таких случаех существуют alias типы type MutableMatrix mut [] mut [] * mut T
𝗠𝗮𝗿𝘂𝗳
Всем Салют! Установил go на другой ноут. В vscode при установке 10 расширений выпадает ошибка пожалуйста, помогите решить, хз в чем проблема
Artem
там не написано
Artem
там написано мол ой а вдруг понадобится тогда придется юзать мутабельное
𝗠𝗮𝗿𝘂𝗳
𝗠𝗮𝗿𝘂𝗳
Artem
В скольки процентах операций потребуется что-то сложнее этого: const a = []int{1,2,3}?
несколькими параллельными процессами изменять один слайс или матрицу итд
Viktor
git установите
𝗠𝗮𝗿𝘂𝗳
так установлен
Zver
так установлен
Пробуй вручную пакет поставить, что скажет.
Roman
В скольки процентах операций потребуется что-то сложнее этого: const a = []int{1,2,3}?
если лень читать: если иммутабельность сильно ограничивает - её выбросят. Чем полезна такая концепция иммутабельности, которая работает только в простых случаях а в более сложных - неприменима? это, знаешь... как если ребёнку поставить вспомогающие колёсики на велосипед чтоб он катался по двору, а когда он поедет на этом велике с горки - убрать колёсики (не лучший пример, но спотанно в голову пришло только это) щит нужен тогда, когда в тебя 50м калибром херачат, а не тогда, когда на тебя нападают тупым ножом))
Artem
по мне так более выгодно было бы сделать как в скале. либо все мутабельное либо нет. Дабы избежать вот такой двоякости
Zver
Artem
val и var
$continue$
Можно ли на Go писать addon для browser
Aleksandr
потому-что это transitive immutabiliy, который я уже упоминал только-что, читайте тут
давай так: если я ставлю const я хочу чтобы a[0] = 4 вызвало ошибку. Но если я хочу все же изменить, ничего мне не помешает подшаманить: i := &a[0]; *i = 4. Почему бы не пойти на компромисс ля читаемости?
Roman
давай так: если я ставлю const я хочу чтобы a[0] = 4 вызвало ошибку. Но если я хочу все же изменить, ничего мне не помешает подшаманить: i := &a[0]; *i = 4. Почему бы не пойти на компромисс ля читаемости?
я уже пояснил почему, но ладно, повторюсь: в сложных ситуациях люди выбросят имутабельность, которая их ограничивает, но она иммено для этого и нужна: защищать тебя в сложных ситуациях от стрельбы по ногам. Начнётся "дайте нам const_cast"
Aleksandr
в чем ограничивает? изменить часть структуры, помеченной const?
Daniel
а в простых ситуациях люди выбросят иммутабельность, которую не понимают
Daniel
простые - это примерно 99% всех ситуаций
Aleksandr
если я пометил структуру const, я хочу чтобы она не менялась. не корень, не элемент слайса, не вложенная мапа в мапу
$continue$
интересный question
Да... Я после работы, чёт загружен вообще. Исправил вопрос
Roman
а в простых ситуациях люди выбросят иммутабельность, которую не понимают
она им не нужна. Она нужна для надёжных API, пусть каждый пользуется если ему надо, никто не заставляет
$continue$
Я на c++ писал
Daniel
можно и на го - и скомпилять в js
Viktor
https://github.com/gopherjs/gopherjs
Roman
можно и на го - и скомпилять в js
дебажить только потом застрадаешься)
Zver
Может тогда надо const [][] mut *T Чтобы const задавала глобаную константность переменной, а если надо, то можно вложенные структуры сделать мутабельными.
Artem
так и предалагают же
Artem
не?
Daniel
не
Daniel
но это безумие, коллеги
Daniel
с++ как он есть
Zver
И всем удобно. Хотя выглядит странновато.
Daniel
почти любая конструкция имеет смысл, вот только почти никто не знает уверенно, какой
Artem
по дефолту всее иммутабельное, но на нужный тип можешь добавить мутабельность
Roman
с++ как он есть
да нихера это не C++. Это называется "надёжное, чёткое описание намерений", а мы на Go только CLI тулзы пишем? да нет, мы на нём целые кубернетисы валяем
Daniel
как скажешь...
Artem
И бутет все завалено mut-ми.
очевидно будет. Потому что не все понимают что такое иммутабельность и как и зачем ее использовать
𝗠𝗮𝗿𝘂𝗳
Пробуй вручную пакет поставить, что скажет.
вроде работает, с другого компа закинул файлы
Artem
да нихера это не C++. Это называется "надёжное, чёткое описание намерений", а мы на Go только CLI тулзы пишем? да нет, мы на нём целые кубернетисы валяем
в java тоже четко описаны намерения, вот только читабельности 0 не зря сделали, что External и internal вместо private/public
Aleksandr
Роман, необязательно новая фича должна покрывать все кейсы - в данном случае это приводит к усложнению и высокому порогу понимания фичи. Можно компромиссно упростить фичу и выкинуть 5% редких кейсов. Дефолтная иммутабельность всей структуры с одним const - это по-моему единственный вариант, жизнеспособный для внедрения в го
Aleksandr
пиши новый пропозал, без шуток
Aleksandr
не трать мое время
doc
Пиши на расте, без шуток
𝗠𝗮𝗿𝘂𝗳
Пробуй вручную пакет поставить, что скажет.
2 extension все равно не устанавливаются
Zver
𝗠𝗮𝗿𝘂𝗳
да
𝗠𝗮𝗿𝘂𝗳
покапался в переменных средах, вроде все норм
Zver
@Marsaidoff А не может ли быть из-за пробела в пути ....
𝗠𝗮𝗿𝘂𝗳
хммм
Roman
Может тогда надо const [][] mut *T Чтобы const задавала глобаную константность переменной, а если надо, то можно вложенные структуры сделать мутабельными.
DISCLAIMER: WARNING! THE FOLLOWING CODE IS FOR TESTING PURPOSES ONLY! НИКТО НЕ БУДЕТ ТАК ПИСАТЬ КОД, ЭТО ПРОВЕРКА ТЕОРИИ НА ПРАКТИКЕ ПОЖАЛУЙСТА БЕЗ "аа, как сложно, это не Go"! немного абсурдно сложного кода (писать так не рекомендую никому, никогда): map [* T1] [] [] * [] * T2 "map of pointers to T1 to slices of slices of pointers to slices of pointers to T2" первый мут делает все последующие типы мутабельными mut map [* T1] [] [] * [] * T2 ибо в ином случае пришлось бы писать mut map [mut * mut T1] mut [] mut [] mut * mut [] mut * mut T2 иммут в ключе делает T1 иммутабельным, но после него мутабельность продолжается, поскольку ] терминирует mut и не даёт ему дальше "течь" mut map [* immut T1] [] [] * [] * T2 однако immut может заменять мут: mut map [* immut T1] immut [] [] * [] * T2 но вернуть mut тоже можно: mut map [* immut T1] immut [] mut [] * [] * T2 и под конец можно сделать T2 иммут: mut map [* immut T1] immut [] mut [] * [] * immut T2 если убрать первый mut тогда всё то первого immut'а вне суб-контекстах (map key) будет immut: map [* immut T1] immut [] mut [] * [] * immut T2 и линтер может предложить убрать лишний immut: map [* immut T1] [] mut [] * [] * immut T2
Roman
Роман, необязательно новая фича должна покрывать все кейсы - в данном случае это приводит к усложнению и высокому порогу понимания фичи. Можно компромиссно упростить фичу и выкинуть 5% редких кейсов. Дефолтная иммутабельность всей структуры с одним const - это по-моему единственный вариант, жизнеспособный для внедрения в го
собственно вот, можно написать: mut [][] int и всё будет мутабельно. Так-же можно написать: [][] int и всё будет немутабельно. А для очень редких случаев можно написать: mut [][] immut int чтобы всё кроме int'а было мутабельно. Ну а для ещё более редких: mut [] immut [] mut int чтоб прям оочень точно выразить что мут а что нет.
Artem
Ехал mut через immut Видит mut immut в mut mut Сунул mut в immut immut Mut immut immut mut mut
Vladimir
Народ, а что вы спорите о непринятом пропозале в телеграмм канале?
Daniel
и спорим мы с его автором
Vladimir
А
Andrei 🦉
есть следующий вопрос по goswagger: можно ли как то малой кровью встроить ручку с UI для спеки в сгенерированный по этой спеке сервер, типа swagger serve встроить в swagger generate server?
aadz
О! William Kennedy написал в The latest Golang development news про An Immutability Proposal for Go
aadz
Ссылку пожалуйста
William Kennedy An Immutability Proposal for Go ( https://github.com/romshark/Go-1-2-Proposal---Immutability ) — An extensive document with a proposal for adding immutable types to Go, not only to a theoretical Go 2, but in a backwards-compatible way to Go 1.x too. If you want to see some quick examples, check out the FAQ. ( https://github.com/romshark/Go-1-2-Proposal---Immutability#4-faq )
aadz
https://golangweekly.com/issues/231
aadz
А! Это не William Kennedy написал про pro Immitable. Это у них в текстовом виде такое форматирование дурацкое, что непонятно, кто автор. :)
Nik
func main() { var i interface{} = "hello" f, ok := i.(float64) fmt.Println(f, ok) f = i.(float64) // panic fmt.Println(f) } А это как работает? Если я сохраняю второй параметр, то все ок, если нет то паника. Откуда функция утверждения типа знает, что я буду дальше делать с тем, что она вернула?