Andrei 🦉
а зачем это нужно и когда такое требование возникает можно поинтересоваться ?
такое требование возникает из сильной статически типизированной природы го, когда ты используешь пустой интерфейс, то отлавливать баги приходится не на стадии компиляции, а в рантайме
Andrei 🦉
с тем что пустые интерфейсы зло согласны даже "великие и ужасные"
Artem
это уже проблема проектирования скорее, но опять же философия Go -это быстрая компиляция и простота в поддержке в том числе самого core, а все эти типы сильно усложнят компилятор. Просто наверно в таких задачах стоит подумать о другой технологии.
Artem
да и че то я не готов пока воспринимать Гошу, как строго типизированный ЯП :)
Artem
для меня это скрипт на стероидах
Anonymous
в Go пакеты не могут взаимодействовать друг с другом?
Alexander
пакеты ? в смысле функции/методы вызывать из разных пакетов ? можно
Alexander
надо только публичные методы/функции называть с большой буквы
Anonymous
ну например у меня есть пакет а и пакет б пакет а должен юзать функции пакета б, и наоборот
Anonymous
выходит ошибка import cycle not allowed
Alexander
через третьего разруливайте
Anonymous
Либо посмотреть, почему цикл получился. Что-то с архитектурой
Artem
выходит ошибка import cycle not allowed
https://stackoverflow.com/a/28258647/2611075
Alexander
а если прога небольшая, пишите все в пакете main. тут не джава, не надо пицот пакетов объявлять.
🎉
ну например у меня есть пакет а и пакет б пакет а должен юзать функции пакета б, и наоборот
А ты правильно назови их и все данные которые хочешь экспортировать первую букву в верхнем регистре пиши, функции, типы, структуры. То есть, пакеты которые лежат рядом, все должны иметь package main, но только в одном из них должна быть функция main().
Artem
это почему же? он таковым по факту является
его таковым называют и в нем есть необходимость привидения типов, но наличие возможности утиной типизации уже априори переводит процесс написания кода на другой уровень, в языке с поддержкой такой фичи странно ждать детального анализа кода от компилятора, это же просто компромисс. Более того язык подразумевает возможность выполнения в роли скрипта без компиляции путем установки рантайма.
Pawel
Зачем хаять, если "ниасилил"?
почему решили что не "ниасилил"?
Sergey
почему решили что не "ниасилил"?
Такое впечатление сложилось.
Artem
и да я не говорил, что она ослабляет контроль типов, а только то, что не все проверки будут проходить на уровне компилятора, этот тот самый компромисс, который позволяет его не усложнять
Pawel
github.com/kless/gonow wiki.ubuntu.com/gorun т.е. через #!/usr/bin/env gorun и #!/usr/bin/env gonow
это сейчас есть в любом статическом языке если что
Artem
> Более того язык подразумевает возможность выполнения в роли скрипта без компиляции путем установки рантайма. Хочешь покажу как код на C++ запускать также? 😃
не спасибо, в крестах нет утиной типизации и они дальше от скрипта, а в Гоше с его уткой вполне можно скрипты писать ))
Алексей
Artem
В плюсах есть статический аналог утиной типизации - структурная типизация.
слишком много танцев с бубном для простого присваивания
Artem
Скрипты - это никак не про утиную типизацию...
естественно, но с точки зрения решения задач Гоша ближе, поскольку позволяет избегать указания типов.
Artem
вы доказываете очевидные вещи, как будто их кто то не понимает, а смысл? есть факт, это реализованно так и иначе не будет. Это реализованно так потому, что такой компилятор и такая парадигма и это сделанно осознанно (или так получилось, нe важно и уже не изменится). Это исрумент с координально другим подходом и этот подход работает
Artem
какой смысл жаловаться? Вас не устраивают аргументы? не пользуйтесь, другим их достаточно или они не нужны вообще, а писать на нем, как на питоне или крестах все равно не получится, это другой мир )))
Pawel
и да я не говорил, что она ослабляет контроль типов, а только то, что не все проверки будут проходить на уровне компилятора, этот тот самый компромисс, который позволяет его не усложнять
"не все проверки будут проходить на уровне компилятора" - это не соответствует действительности. В случае утиной типизации ,как и влюбых других случаях, в языке Go ВСЕ проверки соответствия типов выполняются компилятором.
Artem
а весомых аргументов для вас не будет, в любом торте можно найти кусок говна, важно только качество вашего микроскопа.
Michael
так о чём спор-то, кто кого строже?
Artem
не понял вопрос
каким образом компилятор выполняет проверку типа интерфейса передаваемого, если значение вычисляется в момент исполнения?
Artem
так о чём спор-то, кто кого строже?
это вряд ли прям спор, поскольку у меня экспертизы почти 0 ))) но так интересней постигать тему, срач -это всегда движение вперед )
Andrei 🦉
каким образом компилятор выполняет проверку типа интерфейса передаваемого, если значение вычисляется в момент исполнения?
он проверяет, что переданная структура действительно реализует указанный интерфейс на этапе компиляции
Pawel
каким образом компилятор выполняет проверку типа интерфейса передаваемого, если значение вычисляется в момент исполнения?
элементарно. если тип объекта удовлетворяет заявленному интерейсу, то у него есть соответствующие методы.
Artem
он проверяет, что переданная структура действительно реализует указанный интерфейс на этапе компиляции
он проверяет наличие требуемых методов и не гаррантирует их поведение, а значит основной отлов ошибок будет происходить в рантайме, речь только об этом была
Andrei 🦉
он проверяет наличие требуемых методов и не гаррантирует их поведение, а значит основной отлов ошибок будет происходить в рантайме, речь только об этом была
ты не сможешь ничего сделать со структурой, которая лежит под интерфейсом без его явного приведения к типу
Michael
он проверяет наличие требуемых методов и не гаррантирует их поведение, а значит основной отлов ошибок будет происходить в рантайме, речь только об этом была
у Гоу неявная реализация интерфейсов, чтобы соответсвовать интерфейсу, у структуры должны быть соотв методы
Pawel
он проверяет наличие требуемых методов и не гаррантирует их поведение, а значит основной отлов ошибок будет происходить в рантайме, речь только об этом была
Вы хотите сказать, что в других статических языках компилятор не только проверяет наличие методов, но и гарантирует их поведение? О_о
Michael
шраст
Michael
вероятно
Anonymous
кхм кхм.. rust кхм.. кхм..
Он гарантирует работу с памятью, а не гарантирует, что ты не поделишь на ноль ))
Artem
Вы хотите сказать, что в других статических языках компилятор не только проверяет наличие методов, но и гарантирует их поведение? О_о
я хочу сказать, что если ваш компилятор ожидает строку, то проверяет он только то, что она ведет себя как строка, имеет определенный набор методов, но это не значит, что это строка и в случае со структурами это очень серьезной проблемой может быть. И да в других компилуемых языках (большинстве) это гаррантированно исключено.
Andrei 🦉
поскольку чатик оживился, может у кого-нибудь есть что то на примете? гугл не помог
Andrei 🦉
у кого нибудь есть на примете либа с реализацией базовых алгоритмов, где в сигнатурах публичных функций отсутствует interface{} ?
Anonymous
это Тайна
режим Ванги не помог (( хрустальный шар тоже...
Michael
гифка_о_генерыках_в_го.жпг
Anonymous
гифка_о_генерыках_в_го.жпг
Пустая картинка.жопег? Или с монстром?
Michael
одна из реализаций)
Artem
какой проблемой это может быть например?
если объект ведет себя как ожидаемый, но имеет иное поведение скрытое от компилятора это вырастает в проблему с логикой, отловить которую очень сложно. И Если отказаться от передачи интерфейса и неявного привидения типа, этого можно избежать
Alexander
простите, вам теория категорий в го нужна?
Andrei 🦉
define "базовых"
поправка, базовые структуры данных и алгоритмы работы с ними что то типа этого, но с реализациями для всех встроенных типов без пустых интерфейсов https://github.com/Workiva/go-datastructures
Andrei 🦉
Думаю это impossible.
вполне possible, все тоже самое, только еще немного кодогенерации сверху для замены дж****ков
Pawel
если объект ведет себя как ожидаемый, но имеет иное поведение скрытое от компилятора это вырастает в проблему с логикой, отловить которую очень сложно. И Если отказаться от передачи интерфейса и неявного привидения типа, этого можно избежать
Вы фантазируете. То, что вы описали - это типичный пример ЛЮБОЙ абстракции - скрывать детали реализации от публичного апи. Функция - это тоже абстракция, она тоже может грохнуться в рантайме. К статической типизации это не имеет ВООБЩЕ ни какого отношения
Artem
Вы фантазируете. То, что вы описали - это типичный пример ЛЮБОЙ абстракции - скрывать детали реализации от публичного апи. Функция - это тоже абстракция, она тоже может грохнуться в рантайме. К статической типизации это не имеет ВООБЩЕ ни какого отношения
все мои фантазии сводятся к тому, что использование интерфейсов вынуждает полагаться на неявное приведение типов и это хоть и не имеет отношения к динамической типизации, но исключает возможность называть язык строго типизуруемым, он просто ведет себя как строготипизированный и его используют, как строго типизированный.
Nikolay
Вы фантазируете. То, что вы описали - это типичный пример ЛЮБОЙ абстракции - скрывать детали реализации от публичного апи. Функция - это тоже абстракция, она тоже может грохнуться в рантайме. К статической типизации это не имеет ВООБЩЕ ни какого отношения
не стоит с ним спорить, там немного каша в голове. как только выключит режим «эксперта» и разберется в азах - сам поймет, пока смысла объяснять нет, слышать не слышит все равно же
Artem
не стоит с ним спорить, там немного каша в голове. как только выключит режим «эксперта» и разберется в азах - сам поймет, пока смысла объяснять нет, слышать не слышит все равно же
дело в том, что режима эксперта у меня как раз нет, все о чем я говорю -это то, как себе это представляю, а все замечания конспектирую для рассмотрения. Для меня не страшно оказаться не правым или выглядеть глупым. по крайней мере в данном случае и я готов учиться, как и признать свои ошибки )
Алексей
Есть интерфейс, есть его имплементация. Имплементация даже в сильной типизации может неявно приводиться к типу интерфейса вне зависимоти от реализации.
Artem
я не претендую на истиность и мне интересно читать доводы, но советую ознакомиться например с таким ответом https://softwareengineering.stackexchange.com/a/77998
Pawel
я не претендую на истиность и мне интересно читать доводы, но советую ознакомиться например с таким ответом https://softwareengineering.stackexchange.com/a/77998
@nadyatch прав, Вам нужно разобраться что такое статическая типизация. В частности чем она отличается от статических гарантий безопасности. И реплики из интернета тут не помогут, лишь путаницу внесут.