
Kirill
27.02.2018
14:27:20
и зависит всё от того, что решит компилятор
это не зависит от того, что ты лично думаешь, что может быть произойдет, а может и нет

Alexander
27.02.2018
14:27:43
не что решит компилятор, а что написано в исходниках
а там написано - вернуть слайс, указывающий на тот же буфер

Google

Kirill
27.02.2018
14:28:10
ты ссылку кидал на strings, а не на компилятор

Monday Begins on Saturday
27.02.2018
14:29:18
Кто был на Badoo'шном митинге. Доклады уже выложили где-нибудь?

Kirill
27.02.2018
14:29:23
и отказываешься понимать, что _компилятору_ решать, как будет работать в реальности код. да, он даст эквивалентную логику, но может сам смотреть, как именено, потому что строки иммутабельны и он может сложить в .readonly, а может и нет

Alexander
27.02.2018
14:31:12
компилятор не волшебник, он делает то, что написано в программе. А в программе _нет_ копирования буфера при вызове string.Trim
О чем я и сказал в самом начале

Kirill
27.02.2018
14:31:45
спасибо, так лучше :))
хотя нет, гоню, нужен другой способ

Илья
27.02.2018
14:36:04
да, тут же просто указатель на структуру, и он всегда разный

Alexander
27.02.2018
14:36:05
Да, это структура, описывающая строку скопировалась.

Илья
27.02.2018
14:36:14
нужно вытащить указатель на блок данных ?

meehalkoff✪
27.02.2018
14:36:25
какой то подтекст?)

Илья
27.02.2018
14:39:23
https://play.golang.org/p/7JIfsW3vEyW

Google

Alexander
27.02.2018
14:40:37
?

Evgeniy
27.02.2018
14:40:46
т.е. получается реально одна строка, но с разной длиной?
прикольно

Alexander
27.02.2018
14:42:08
https://play.golang.org/p/DNiDotpJNDn - а вот пример с TrimSpace

Kirill
27.02.2018
14:42:56

Alexander
27.02.2018
14:45:34
Trim прямо копировал строку? Это странно, конечно, ну да ладно. Кстати, это пример, почему иммутабельные строки - это хорошо. Можно делать вот такие выкрутасы с подстроками очень эффективно.

Илья
27.02.2018
14:46:31
хм, а как в этом случае GC определит, что блок данных можно освободить? :S
или я туплю?

Alexander
27.02.2018
14:47:36
GC просто умный :) Я не знаю, как он работает, но, думаю, не освобождает блок, пока ссылки на него есть.

Илья
27.02.2018
14:47:57
(As an aside, there is a well-known gotcha in Java and other languages that when you slice a string to save a small piece, the reference to the original keeps the entire original string in memory even though only a small amount is still needed. Go has this gotcha too. The alternative, which we tried and rejected, is to make string slicing so expensive—an allocation and a copy—that most programs avoid it.)
не умный
?
вообщем нет, я не туплю ?

Виктор
27.02.2018
14:59:24
Он не умный но вы умнее. Так что вы сами должны знать когда вы имеете дело с большой строкой и маленькой подстрокой а когда строка небольшая и можно оставитьв мпамяти)
Классика же)

Aleksandr
27.02.2018
15:07:46
https://golang.github.io/dep/
не видел раньше - у dep сайт появился

John
27.02.2018
15:08:49

Aleksandr
27.02.2018
15:08:57

Google

Aleksandr
27.02.2018
15:09:16
а что еще там должно быть? доки да ссылка скачать

John
27.02.2018
15:09:27
хм... и правда, доки есть
Думал, ссылка на wiki на гитхаб будет ))

Илья
27.02.2018
15:10:38
они месяц назад сделали доку
https://golang.github.io/dep/blog/2018/01/23/announce-v0.4.0.html

Michael
27.02.2018
15:19:52

The
27.02.2018
15:20:05
где хранить пул коннектов? вот у меня есть пакет database, в нем есть connect() который устанавливает соединение и Get() который возвращает *sql.DB, это нормалная реализация? Или нужно делать вот эту структуру с Env: куда ложить логгер, db, и прочее?

Michael
27.02.2018
15:20:45

John
27.02.2018
15:24:32

The
27.02.2018
15:24:54
пул коннектов я имею ввиду sql.DB, там же внутри есть уже пул
короче, где хранить *sql.DB
вот что я хотел узнать)

Alexey
27.02.2018
15:25:21

The
27.02.2018
15:26:43
ну т.е., у меня есть хендлеры, и в них передавать *sql.DB? а чем плохо database.Get().Query() делать?
ну или database.Get() и погнал

Alexey
27.02.2018
15:26:56

Marlik
27.02.2018
15:28:04

Alexey
27.02.2018
15:28:30
Зачем Get? database.DB.Query()

The
27.02.2018
15:29:12
пока sql.Open() поинтер будет нил, и потом будет race condition

Google

Alexey
27.02.2018
15:29:58
Есть init

The
27.02.2018
15:30:19
init блочит же

Marlik
27.02.2018
15:30:34
Инит лучше не юзать.

Димка
27.02.2018
15:30:57

Alexey
27.02.2018
15:31:07
Инит, да, плохо. Или заранее, прочитать конфиг, соединение с базой сделать

The
27.02.2018
15:31:41

Marlik
27.02.2018
15:31:42
Да вон же наверху ссылка, написано криво, но смысл там понятен, там всего два файла.
И пока прога не проинициализируется, нахрена ей отвечать что-то?

The
27.02.2018
15:32:55

Admin
ERROR: S client not available

The
27.02.2018
15:33:18
она должна отвечать ошибкой и не копить их, ну или копить пока не треснет

Marlik
27.02.2018
15:33:55
Нихрена не понял, у тебя нет соединения с базой, нет ничего, но уже есть коннекты?

The
27.02.2018
15:34:14
ну да, люди долбят сайт

Alexey
27.02.2018
15:35:08

Marlik
27.02.2018
15:36:09
Смотря как сайт стартует, если без бэкенда стартует то хз, так-то пока бэкенд не готов нехер чото делать. Пусть бэкенд сначала стартует, генерит шаблон сайта, подрубается к БД, а потом и обрабатывать запросы можно.

Alexey
27.02.2018
15:36:57
Сперва читаем конфиг, пусть пока долбят, мы их не слушаем. Согласно конфигу соединяемся с базой и т.п. мы никого не слушаем, зачем? Потом поднимаем хттп сервер
Те кто долбят моргнуть не успеют как это всё произойдёт
Или база на марсе?

The
27.02.2018
15:38:37
проблема в том, что если база упала, а перед Go нету ничего (например, Nginx), то сайт будет валяться как труп
нужно отобразить какую-то ошибку

Google

The
27.02.2018
15:38:47
если ставишь вперед nginx
то он копит в пул соединения, если твой сокет или порт начинает отвечать
но тогда пул разростается, вариант с тем чтобы читать конфиг и валятся мертвяком с nginx спереди приемлем.

Marlik
27.02.2018
15:39:30
Ну дык если упала база, фактически и бэкенд накрылся, тада фронтенд должен ошибку отобразить.

The
27.02.2018
15:39:34
тогда nginx будет отрисовывать ошибки

Alexey
27.02.2018
15:39:48
Какой пул?
Нет базы после старта, отвечай 500
Но коннект уже настроен, он будет реконектиться сам

Andrey
27.02.2018
15:41:12
Каждый день удивляюсь предметам спора в этом чате

Alexey
27.02.2018
15:42:39
Я ж ведь даже и не спорил

The
27.02.2018
15:49:15
Вопрос изначально был о том, где хранить *sql.DB. В init() не вариант. Прямой доступ тоже как-то плохо. Что мешает где-то по тупняку сделать db = nil? Делаем Get() возвращающий поинтер на *sql.DB и connect() который коннектится к базе и подменяет поинтер через atomic.SwapPointer, чтобы гонки не было. Или я не прав?

Alexey
27.02.2018
15:49:16
Это даже лучше не слушать пока все инициализации не пройдут. Человек открывает страницу, а у него полосочка загрузки начинает медленно передвигаться, он не уходит пока у тебя приложуха стартует, секунд 20 ждёт, энжи также делает прежде чем 500 отдать. Потом у тебя запустился сервер и всем отдал инфу. А если ты сразу всем отдашь 500, а потом начнёшь конфиг читать, не все вернутся потом за инфой. Да и порт на котором принимать запросы разве не в конфиге?
И ты перед каждым запросом коннект типа поднимаешь?

Илья
27.02.2018
15:51:10
мда, записывайтесь к Василию на курс вообщем

Alexey
27.02.2018
15:51:30
И больше не ешь эти грибы

Andrey
27.02.2018
15:56:47
Интересный вопрос.
Если я в переменной храню указатель и в миллионе горутин его читаю, но только в одной пишу. При этом мне не важно прочитался старый указатель или новый. Состояние гонки может повредить указатель при одновременном чтении и записи и надо лочить?

Alexey
27.02.2018
15:57:21
go-database-sql.org вот это хорошо читать

Stanislav
27.02.2018
15:57:44

Alexey
27.02.2018
15:58:24

Andrey
27.02.2018
15:58:39

Stanislav
27.02.2018
15:59:10
В гошечке одновременное чтение будет тебе триггерить варнинги про рейсы и у тебя твои миллион горутин повесят нахрен все)