Artem
ну вообщем надеюсь для меня это пока не так будет важно и можно абстрагироваться от этого) просто запомнив что для map - make а для структур new) и хватит) потом в процессе просвещусь как нить
это принципиально важно. В одном случае вы получаете инициализацию композитного типа, а в другом указатель на инициализированную память.
Artem
в принципе для использования в решении простых задач достаточно знания того, что make используется например со слайсами, но вопрос указателей принципиален если вы планируете работать с go. r = new(T), это то же, что и var temp T и дальше r = &temp
Антон
это принципиально важно. В одном случае вы получаете инициализацию композитного типа, а в другом указатель на инициализированную память.
я вообще слабо понимаю принцип указателей, наверное лучше бы было первым изучать Си и не видеть альтернатив, что бы все в голове отложилось. А после питона, я не понимаю, зачем это впринципе нужно и почему нельзя просто брать все подрят и запихивать друг в друга и тд.
Anonymous
я вообще слабо понимаю принцип указателей, наверное лучше бы было первым изучать Си и не видеть альтернатив, что бы все в голове отложилось. А после питона, я не понимаю, зачем это впринципе нужно и почему нельзя просто брать все подрят и запихивать друг в друга и тд.
Условно: Без указателя - обращаешься к копии переменной (можешь её переписать, но исходное значение не поменяется. С указателем - при обращении можешь перезаписать исходное значение.
Anonymous
Коряво объяснил 😞
Artem
я вообще слабо понимаю принцип указателей, наверное лучше бы было первым изучать Си и не видеть альтернатив, что бы все в голове отложилось. А после питона, я не понимаю, зачем это впринципе нужно и почему нельзя просто брать все подрят и запихивать друг в друга и тд.
в python тоже объекты передаются п разному. Если вы передаете в метод изменяемый объект, то метд получает ссылку. т.е. передавая list, нчиего нового не создается и любые изменения в этом list внутри меда будут отражены в оригинальном. Вся суть указателей впростых вещах, если вы работаете со значением, то при передаче вы по сути получаете новую переменную и ее изменения не отражаются на оригинале, если же вы передаете ссылку то новой переменной не создается, вы просто получаете адрес и все изменения затрагивают оригинальный объект поэтом адресу
Artem
а какой смысл тогда делать отдельно возможность передавать в функцию например копию и не затрагивать оригинал? смысл? питон чем ограничен из-за этого? что он по умолчанию передает ссылку и не надо постоянно звездочку ставить.
а какой смысл добавлять tuple, если есть list ? list же круче, он тоже по сути список значений но еще и изменяемый но и да если не ошибаюсь кортеж передается по значению
Artem
это просто инструмент дающий больше гибкости и управления выделением памяти. Когда вы передаете значение это всегда получение нового адреса и присваивания ему этого значения
Artem
т.е. var a = 5 и если b = a тут все секреты
Artem
если при b = a а это ссылка, то дальнейшие изменения b затронут ее, а если то значение, то а останется прежним
Антон
а какой смысл добавлять tuple, если есть list ? list же круче, он тоже по сути список значений но еще и изменяемый но и да если не ошибаюсь кортеж передается по значению
ну вот смотри. Я очень толстый 200 кг и мне тяжело идти в гости на ужин, я посылаю указатель, младший брат, который будет жрать на ужине и я буду толстеть. Но.. Если я типа сам захочу пойти, то пойдет мой клон 200 кг, но если он будет жрать, то со мной ничего происходить не будет, зачем тогда его туда посылать? я думал что если пойдет клон , пускай это и затратно по памяти, полная копия, но изменяться оригинал то должен, иначе зачем это все
Artem
важно понимать что так происходит, понимание когда это нужно придет на практике
Антон
рабочий пример нужен, желательно с аналогией из жизни, что бы понять)
Антон
все понял. пришло прояснение. Короче если мне переменная нужна только для того, что бы внутри функции с помощью ее значения получить что-то другое, то я передаю ее в функцию, а если мне нужно не просто что-то получить а именно ее изменить, то я передам указатель на нее.
Антон
как то так
Artem
рабочий пример нужен, желательно с аналогией из жизни, что бы понять)
Все в логике верно, если есть вы с 200кг - вы объект. Идти на вечринку -это метод, когда вы передаете в него ссылку, вы толстете, когда вы передаете значение, то на вечеринке ваша копия, все счастливы, место занято, вы веселите людей и т.д. Но далеко не всегда вы идете на вечеринку, иногда вам нужноидти в тюрьму, и вряд ли вы захотите туда тправлять себя самого
Artem
это может радикально, но достаточно для понимания, далеко не всегда требуются изменения оригинального объекта
Artem
В python объекты передаются в виде ссылок на эти самые объекты.
x.append("20") здесь x ссылочный тип, а здесь x = "30" строка это тоже объект и передается она в выражение по значению, результатом является копия строки p.s. но собствено вы правы, просто в контексте беседы это не особо важно ))
Антон
вроде что-то прояснилось. Спасибо что обьяснили)
Artem
когда разберетесь с профилировщиком в Go и посмотрите как выделается память в ваших программах, тогда все будет понятней, это придет само. Если коротко, то существует мнение, что очень важно делать минимальные алокации и нужно стремиться к максимальному переиспользованию созданных объектов, это принципиально влияет на производительность.
Michael
Коллекции - make, структуры - &struct{}, если нужно аля *int - new, и будет счастье
Michael
В любом языке - минимум аллокаций - это хорошо
Artem
структуры - &struct{} тут я не уверен, но вроде эта конструкция создаст объект в хипе, а вот new(struct) создаст его в стеке
Anonymous
Artem
🤦‍♂️
Anonymous
Надеюсь криптовалюта?
Logan
Надеюсь криптовалюта?
скорее – клады
Logan
@m0sth8, @kirilldanishin?
Anonymous
@m0sth8, @kirilldanishin?
Они уже зарабатывают там
Sergey
Всем привет, разбираюсь с принципами написания сервера на go и возник вопрос, нужно ли запускать метод http.ListenAndServe(":8080", router) как отдельную горутину написал вприставку go, или метод будет работать ассинхронно сам по себе? Я именно не понимаю момент смогут ли пользоваться этим api одновременно несколько юзеров, если не запустить метод как горутину
heavycharged
можно и в отдельной, но если вы это делаете в main(), тогда нужно либо WaitGroup делать, либо канал который скажет что сервер отработал
heavycharged
асинхронность будет из коробки, не важно добавите вы go перед запуском или нет.
G72K
Кто-нибудь C++ либу прикручивал к Го, сильно больно?
G72K
Либа классическая ООП без темплейтов (по крайней мере не торчат наружу)
Roman
Кто-нибудь C++ либу прикручивал к Го, сильно больно?
не больно, но работать будет медленно
G72K
В смысле лучше дергать редко и надолго?
Roman
а как сделать пул горутин? )
Roman
просто спавнить и кормить данными через каналы?
heavycharged
ну да, я так делал, fan out / fan in.
heavycharged
можно прилепить ещё один канал по которому можно посылать сигнал стоп, чтобы контролить этот зоопарк весь
G72K
просто спавнить и кормить данными через каналы?
Я еще замыканиями люблю кормить, тогда вообще в самих горутинах логики нет
andrew
не больно, но работать будет медленно
почему? Всегда думал что так и делают в местах где требуется скорость.
Roman
просто спавнить горутины в моем случае очень дорого
Roman
и роняет производительность ~ в 100 раз
G72K
У вас спавн горутины дороже вычислений в ней?
Roman
У вас спавн горутины дороже вычислений в ней?
да. ну и еще это убивает локальность
G72K
Может нафиг их тогда? :)
G72K
Если все так филигранно, кормите через массив mutex, быстрее каналов будет
Roman
Может нафиг их тогда? :)
я распараллелиться хотел )
Roman
Если все так филигранно, кормите через массив mutex, быстрее каналов будет
ок, поясню. мне приходит пачка(1024 шт) пакетов и я их обрабатываю. решил на каждую пачку спавнить горутину и ждать завершения. оказалось, что все становится в 100 раз медленнее
G72K
Точно предзапуск и кормежка через mutex. Взяли mutex, взяли slice, отпустили mutex, считаем slice.
G72K
Если всегда известно что будет именно 1024 и все они +- равны, то можно просто всех будить и каждая горутина возьмет свой заранее известный слайс, без всяких мьютексов. Не знаю легально ли это и что race detector скажет
Alexander
ок, поясню. мне приходит пачка(1024 шт) пакетов и я их обрабатываю. решил на каждую пачку спавнить горутину и ждать завершения. оказалось, что все становится в 100 раз медленнее
Пул воркеров - настолько классическая и легко решаемая в Го задача, что она даже описана в учебных материалах для начинающих - https://gobyexample.com/worker-pools
Alexander
Но если хочется что-то посложнее, но более управляемое, то есть библиотеки для этого - например https://github.com/Jeffail/tunny
Anonymous
кто что использует чтобы автоматически перезапускать go run при изменении файлов?
Anonymous
/me просто запускает make перед запуском бинарника
Anonymous
ммм, предположим у меня два монитора: на одном IDE, на другом консоль где запускается проект я _не_ деплою в продакшн, _не_ пишу мейкфайлов (типа такого https://gist.github.com/lantins/e83477d8bccab83f078d), _не_ хочу чтобы было сложно просто хочется писать код и смотреть на результат выполнения в риалтайме... типа как в nodejs nodemon index.js или supervisor -n exit index.js
Anonymous
Или надо прям вообще без кнопок?
Anonymous
не знаю, я не настоящий го-кодер а только поставил, vscode у меня
heavycharged
это надо веб-сокет и долбать в браузер об изменении, вроде в ноде так сделано
Anonymous
накидайте плагинов если есть, покопаю :)
Anonymous
это надо веб-сокет и долбать в браузер об изменении, вроде в ноде так сделано
не не, вы путаете live reload хттп-странички и тупо рестарт процесса при изменении содержимого директории… мне второе
heavycharged
можете поискать filewatcher либу, пусть она смотрит вашу папку, и при изменении делает go build и запускает)) но если вы под виндой, сомневаюсь что это сработает
heavycharged
ну и F5 таки придется жмакать
heavycharged
а вообще был фреймворк который это умеет
heavycharged
правда не помню какой
heavycharged
там прям в режиме разработки такое поведение
Anonymous
А в чём смысл такой фигни? Не успел дописать код, а IDE уже должен начинать запускать недописанный код? Фигня какая-то... 😃
heavycharged
эм, ну это у JS программистов такая шняга. потому что там если больше получаса пишешь а потом запустишь, то багу потом долго будешь искать
heavycharged
вообще это попинать удобно, но когда руку уже набил то это бессмыслица