Daniel
строки много где иммутабельные. в яве, к примеру. у них паттерн использования такой, что мутабельность серьезными проблемами грозит.
Eugene
ну я про то что в стд либе го яркий пример как иммутабельность молоточком тюк - можно в билдере этом в буффере байтик на любой позиции поменять и привет, была одна строка,а стала совсем другая
Daniel
нет
Daniel
нету там методов менять строки
Eugene
а ну да, пардон, он с маленькой буквы
Евгений
Кто как передает coverage в TeamCity? использую go-test-teamcity, гоняю тесты с -cover в консоль выводится. Прохождение самих тестов работает ок. А вот покрытие TC не хавает
Евгений
go test -v ./... -cover -race -bench=. | /go/bin/go-test-teamcity
Pawel
это был вам намёк, что делом надо заниматься, а не призрачный тест кавердж блюсти
Oleh
Есть ли какая-нибудь стандартная штука помимо strings.Replace, которая могла бы удалить пробелы из строки https://play.golang.org/p/xVkOyp6nX-8
Васильев Виктор
Trim?
Stepan
Trim?
трим по краям же убирает
Васильев Виктор
Ну так в примере внутри пробелов и нет
Oleh
Trim?
Подходит, спасибо 😊
Васильев Виктор
Есть еще https://golang.org/pkg/strings/#TrimSpace
Васильев Виктор
Проще чуть
Drunk
сахар над Trim?
Alexander
Кстати, Trim, в отличие от Replace не копирует строку
Drunk
а что делает, если строки иммутабельны?
Kirill
Alexander
именно благодаря иммутабельности это возможно. Возвращается подстрока
Drunk
но подстрока - это же и есть новая строка?
Alexander
не совсем. Струкртура "строка" новая, а буфер с самой строкой тот же
Alexander
https://golang.org/src/strings/strings.go - строка 689
Kirill
я знаю, как работает trimfunc
Kirill
или ты на trimrightfunc ссылаешься?
Kirill
так вот, гарантии, что это будет подстрока - никакой от слова совсем
Alexander
Trim вызывает TrimRightFunc - всё есть же в сорцах
Kirill
я по ссылке не ходил, не помню, что в 689
Drunk
там Trim функция, в которой вызывается TrimRight над TrimLeft
Drunk
и возвращается тип срез строки
Drunk
но это и есть новая строка
Alexander
Сходи по ссылке посмотри. Буфер в строке - это слайс. Строка, как структура - это длина и указатель на буфер.
Alexander
Один и тот же буфер может быть частью нескольких строк
Kirill
это может быть: - ссылка на область памяти, подлежащая другой строке - _копия_ области памяти, то есть - новая строка.
Kirill
и зависит всё от того, что решит компилятор
Kirill
это не зависит от того, что ты лично думаешь, что может быть произойдет, а может и нет
Alexander
не что решит компилятор, а что написано в исходниках
Alexander
а там написано - вернуть слайс, указывающий на тот же буфер
Kirill
ты ссылку кидал на strings, а не на компилятор
Dmitriy / დიმიტრი
Кто был на Badoo'шном митинге. Доклады уже выложили где-нибудь?
Kirill
и отказываешься понимать, что _компилятору_ решать, как будет работать в реальности код. да, он даст эквивалентную логику, но может сам смотреть, как именено, потому что строки иммутабельны и он может сложить в .readonly, а может и нет
Alexander
компилятор не волшебник, он делает то, что написано в программе. А в программе _нет_ копирования буфера при вызове string.Trim
Alexander
О чем я и сказал в самом начале
Kirill
спасибо, так лучше :))
Kirill
хотя нет, гоню, нужен другой способ
Илья
да, тут же просто указатель на структуру, и он всегда разный
Alexander
Да, это структура, описывающая строку скопировалась.
Илья
нужно вытащить указатель на блок данных 🙂
Mikhail
какой то подтекст?)
Илья
https://play.golang.org/p/7JIfsW3vEyW
Alexander
👍
Drunk
т.е. получается реально одна строка, но с разной длиной?
Drunk
прикольно
Alexander
https://play.golang.org/p/DNiDotpJNDn - а вот пример с TrimSpace
Kirill
нужно вытащить указатель на блок данных 🙂
говорю же, прогнал) отправил, а потом понял, что ансейфом нужно было приправить)
Kirill
https://play.golang.org/p/DNiDotpJNDn - а вот пример с TrimSpace
да, это я уже понял, я тестил на более старой версии, где происходило копирование
Alexander
Trim прямо копировал строку? Это странно, конечно, ну да ладно. Кстати, это пример, почему иммутабельные строки - это хорошо. Можно делать вот такие выкрутасы с подстроками очень эффективно.
Илья
хм, а как в этом случае GC определит, что блок данных можно освободить? :S
Илья
или я туплю?
Alexander
GC просто умный :) Я не знаю, как он работает, но, думаю, не освобождает блок, пока ссылки на него есть.
Илья
(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.)
Илья
не умный
Илья
🙂
Илья
вообщем нет, я не туплю 🙂
Васильев Виктор
Он не умный но вы умнее. Так что вы сами должны знать когда вы имеете дело с большой строкой и маленькой подстрокой а когда строка небольшая и можно оставитьв мпамяти)
Васильев Виктор
Классика же)
Aleksandr
https://golang.github.io/dep/
Aleksandr
не видел раньше - у dep сайт появился
Anonymous
не видел раньше - у dep сайт появился
Ну как сайт ... страничка, картинка, и несколько кнопок )
Aleksandr
а что еще там должно быть? доки да ссылка скачать
Anonymous
хм... и правда, доки есть
Anonymous
Думал, ссылка на wiki на гитхаб будет ))
Илья
они месяц назад сделали доку
Илья
https://golang.github.io/dep/blog/2018/01/23/announce-v0.4.0.html
heavycharged
где хранить пул коннектов? вот у меня есть пакет database, в нем есть connect() который устанавливает соединение и Get() который возвращает *sql.DB, это нормалная реализация? Или нужно делать вот эту структуру с Env: куда ложить логгер, db, и прочее?