Egor
Почему джава кроссплатформенна
Sergey
Расскажи мне за это )
ну извращение компилировать то что не предназначалось для этого
Egor
А потом придем к пайпай
Мерль
Sergey
да и язык другой не помешает
Мерль
Сделать интерфейс Collection
И никаких пустых интерфейсов
ill-ya
type MyInterface interface { me() *[]MyStructure }
Anonymous
причем тут java? Я попутал со сборкой в exe скриптов питона
Egor
ну извращение компилировать то что не предназначалось для этого
Интелл сделало логику проца на питоне и написало свой компилятор взяв за основу пайпай и ситон
ill-ya
Потом сделал вместо массива структуру и имплементировал в него me()
Egor
Продакшн нормально так что ага
Anonymous
Продакшн нормально так что ага
Ну и сиди на путхон 😆
ill-ya
но там ме возвращает *[1212131]MyStructure
Sergey
Интелл сделало логику проца на питоне и написало свой компилятор взяв за основу пайпай и ситон
ну до таких подробностей я не спускался но все же go низкоуровневый ведь?
ill-ya
а в интерфейсе *[]MyStructure
ill-ya
И опять уперся что ругается тк разное кол-во элементов
Daniel
Нет, на самом деле
Мерль
type MyInterface interface { me() *[]MyStructure }
Да, только для метод можно использовать как Marshall метод
Egor
Си язык высокого уровня, чё о го говорить то
Мерль
И опять уперся что ругается тк разное кол-во элементов
Ты просто не вкурил суть интерфейсов Щас доберусь до ноутбука и покажу
Daniel
На С можно делать низкоуровневое. Ну - пытаться. В го нет адресной арифметики, поэтому на нем пытаться бесполезно
Alexei
если два типа - это массивы одного содержимого с разным количеством элементов, то не проще ли сделать функцию для слайса и приводить эти типы к одному слайсу
Sergey
ох ладно начал самерфилда читать и вникать
Egor
Есть плюсы. Но они не низкоуровневые а явный хай лвл
Egor
Хотя работа с памятью наура
Мерль
И опять уперся что ругается тк разное кол-во элементов
Тут два варинта: - либо, как выше указал @elemc, можно заменить оба этих типа одним в виде слайса структур - либо подумать, какое свойство у твоих структур общее и выделить его в интерфейс. Например, в вашем случае нужно получать дамп каждой коллекции. Тогда сделаем интерфейс Collection с методом DumpCollection(io.Writer) error и реализуем его для каждого вашего типа https://play.golang.org/p/HNQeaVEsK8
Daniel
Будет С, только неудобный
Anonymous
Или тут только вопрос совместимости, что N-ое кол-во либ написано, но несовместимо с новой версией?
Valentin
да, второе
Мерль
А как сделать чтобы получить снова этот же тип массив?
Делай switch по интерфейсу https://play.golang.org/p/Wh3K1n_MZ8
Мерль
Функция PrintCollection
Anonymous
Если я так делаю, это очень плохо? // HatersDevelop project main.go package main import ( "fmt" ) func main() { var x, y int fmt.Println("X NOW:", x, " Y NOW:", y) go split(100, &x, &y) fmt.Println("X NOW:", x, " Y NOW:", y) } func split(sum int, x, y *int) { *x = (sum / 50) *y = ((*x * 3) / 2) }
Anonymous
Очень плохо - это делить на ноль 😄
Anonymous
у тебя последний println не ждет завершения горутины
Да она успевает отработать, так то я sync использую для таких дел
Anonymous
Очень плохо - это делить на ноль 😄
Нет там на 0 деления 😆
Anonymous
Нет там на 0 деления 😆
Значит не "очень плохо" ))
Anonymous
Значит не "очень плохо" ))
То есть в принципе такой подход допускается? И это не очень плохо, а просто плохо )
Anonymous
То есть в принципе такой подход допускается? И это не очень плохо, а просто плохо )
Новая идея для линтера - оценка по шкале, насколько плох код. 😄 Раз компилится и работает, значит допускается (компилятором 😄).
Anonymous
А если он компилится, работает, но результат не вервый на выходе? 😆
Нужно, чтобы устраивало обе стороны - и прогера, и компилятор.
Anonymous
Собственно это и есть программирование в филосовском смысле 😂
Anonymous
Собственно это и есть программирование в филосовском смысле 😂
Спасибо 😆 Если что буду говорить что это фича )))
Dmitry
Кто то говорил делитесь информацией а не памятью
Anonymous
Плохо! Два потока будут использовать общую память. Каналы же есть.
Ну и пускай используют, это как пример только
Dmitry
Ну и пускай используют, это как пример только
Тогда не понятно про что вообще был вопрос...
Anonymous
Тогда не понятно про что вообще был вопрос...
Является ли этот код корректным ну или типа того
Vasily
Он подвержен рейсам
Vasily
Если 1 горутина будет - то ещё прокатит, если несколько - нет
Vasily
go run -race
Anonymous
go run -race
А если запускать горутины последовательно
Vasily
А ты не можешь это контролировать
Vasily
Разве что такими костылями, что правильную реализцию сделать быстрее
Anonymous
wg.Wait и Done равне но контролят это?
Vasily
Они позволяют дождаться завершения пачки горутин
Vasily
Но организовывать последовательный запуск через них - костыли
Anonymous
Ну так если я по одной а не пачкой буду запускать всё же норм должно быть
Anonymous
понятно
Vasily
Сейчас будет норм, а потом ты запустишь без костылей и оно ебанёт и на поиск бага уйдёт куча-времени
Anonymous
Сейчас будет норм, а потом ты запустишь без костылей и оно ебанёт и на поиск бага уйдёт куча-времени
Хорошо а если слайс забивать по ссылке сразу в 2-х горутинах, при этом не важно в каком порядке будут данные поступать, как насчет этого?
Vasily
Тоже плохо. Ты можешь их потерять
Anonymous
Сейчас будет норм, а потом ты запустишь без костылей и оно ебанёт и на поиск бага уйдёт куча-времени
Например мне нужно собрать все пути к файлам в 2-х разных дирах. На каждую диру запускается своя горутина и передаётся срез по ссылке.
Vasily
ебанёт
Anonymous
Тоже плохо. Ты можешь их потерять
Да вроде ничего не терял, но это не точно. А какие ещё варианты есть чтоб каждую диру отдельно не обрабатывать?
Vasily
Любое измнеение шаренных данных из разных горутин может пройзойти из разных системных тредов, что может привести к непредсказуемым результатам
Vasily
если ЧИТАТЬ - то ок если писать - то надо защишаться от рейсов. через канал или мютекс
Anonymous
понял, спасибо.
Dmitry
Глупый вопрос, но почему?
Слайс это всего лишь указатель на память. append в некоторых случаях может выделять новый блок памяти. в одном потоке ты добавил данные, а второй поток выделил новую память и тоже добавил данные. потом они по очереди обнови информацию в слайсе, произойдёт в момент slice := append() как раз когда надо обновить твою переменную, и получится, что слайс будет указывать на другой участок памяти, где данных от первого потока нет