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