heavycharged
я ещё пишу тест перед рефакторингом
heavycharged
если даже функция тривиальная
Je
странно, что перед рефакторингом тривиальные функции, они же как раз могут измениться без изменения внешнего интерфейса
heavycharged
ну если апи тестится ок, и все ожидаемо, то изменив какую-то тривиальную функцию (две, три) можно поломать апи. но потом сложнее вычислить что именно поломало апи.
heavycharged
но я не бог тестов
heavycharged
просто на практике так привык, и мне это кажется удобным
Roman
Ага
А гошечка у вас работает?
Маjко
Roman
есть у нас тут кто с ораклом работал на го?
Roman
не могу понять как для oci8 правильный url к базе составить
Roman
mattn/go-oci8
Алексей
добрый день! подскажите как перекрасить картинку png с зеленого в красный !пописиксельно 255 значений!
Alexandr
Всем привет! Я правильно понимаю, что использовать поинтер на мап это бред, т.к он у нас ссылочный? или это где то применимо?
heavycharged
слайсы, мапы и каналы ссылочные типы
heavycharged
т.е., не нужно делать *map
Alexandr
ок, спасибо)
heavycharged
можете вот это почитать ещё, для справки: https://dave.cheney.net/2017/04/29/there-is-no-pass-by-reference-in-go
Artem
Можно, но не нужно
heavycharged
глобальные - возможно, но доступ через название пакета
heavycharged
доступ к переменным пакета main из других пакетов нет
heavycharged
да, типо того
Daniel
но лучше все же явно передавать хендлер базы куда надо. проще понимать ваш код будет
Cat
нужно всё класть в $GOPATH/src
Cat
локальные пути использовать можно, но не нужно, т.к. ничего не будет работать
Denis
в одной папке только один пакет может быть
Daniel
одна директория - один пакет
Cat
main обычно в верхней директории (если у тебя один бинарник на выходе)
Cat
что именно экспортить?
Cat
с большой буквы — func Database()
Cat
но вообще я не уверен, что Database хорошее название для функции, оно не оторажает никакого действия
Alexander
Cat
Cat
готур прошёл?
Cat
после него есть ещё несколько гайдов вроде
Cat
тут полезные ссылки https://tour.golang.org/concurrency/11
Алексей
как сделать из красной png в зеленый ??RGB?
Cat
ты можешь сделать маппиг из R в G
John
заморочился по передачи поинтерами vs значениями переменных
http://goinbigdata.com/golang-pass-by-pointer-vs-pass-by-value/
понятно, что с точки зрения логики если не нужно копирование и хочется чтобы функции/методы изменяли оригинал - поинтеры, нет - значения
еще думал что с точки зрения логики копирование значения переменной более ресурсоемко, нежели создание на нее нового поинтера.
и тут в статье написали что порой копирование новой переменной будет быстрее о_О.
Кто копался в этой области, подскажите есть смысл заморачиваться с поинтерами если мы используем ну например конструкцию типа
struct {
A int
B string
}?
А если просто var A int?
Можно конечно это все решить на этапе оптимизации, но хочется сразу толковый код писать (очевидно), чтобы меньше потом геммороится
Илья
я бы сказал, 1) нет, 2) нет
Илья
если объект небольшой, то копировать его создавая копию на стеке дешевле, чем выносить его в кучу и передавать ссылку
Vasily
Vasily Romanov:
https://www.coursera.org/learn/golang-webservices-1
https://www.coursera.org/learn/golang-webservices-2
Vasily
John
John
если кто еще годной литературы или статейку по этому поводу подкинет буду премного благодарен, хочется уже расставить все точки над и)
Илья
John
ну писать бенчмарк на каждый свой высер (или искусство) достаточно трудоемко, каждый раз писать не будешь, а если что-то не через поинтер передашь и заказчик потеряет пару тысяч уе бюджета на мощностях из-за этого такое себе))
Илья
Илья
http://goinbigdata.com/golang-pass-by-pointer-vs-pass-by-value/
Илья
тк все зависит от контекста (флоу программы, в смысле сколько раз ты передаешь переменную между скоупами, размера структуры) нет какого-то рецепта
Roman
нельзя просто так взять и кодить на Go
Салтыдык
Есть мнение, что пока не поймёшь как работает его ассемблер, нельзя писать
Roman
Антон
Антон
Лол
Cat
найс аватарка
Маjко
Лол
Nikita
заморочился по передачи поинтерами vs значениями переменных
http://goinbigdata.com/golang-pass-by-pointer-vs-pass-by-value/
понятно, что с точки зрения логики если не нужно копирование и хочется чтобы функции/методы изменяли оригинал - поинтеры, нет - значения
еще думал что с точки зрения логики копирование значения переменной более ресурсоемко, нежели создание на нее нового поинтера.
и тут в статье написали что порой копирование новой переменной будет быстрее о_О.
Кто копался в этой области, подскажите есть смысл заморачиваться с поинтерами если мы используем ну например конструкцию типа
struct {
A int
B string
}?
А если просто var A int?
Можно конечно это все решить на этапе оптимизации, но хочется сразу толковый код писать (очевидно), чтобы меньше потом геммороится
Копирование указателя в го происходит быстрее, чем копирование структуры, т.к. указатель в го - это _структура_ которая копируется (вот так вот, да) и в которой хранится тип и адрес уже непосредственно данных в памяти. А вот обращение к данным по ссылке конечно медленее - цена за разыменовывание. В го ГЦ работает не так, как в дотнете или жаве. В дотнете, объекты ГЦ маркируются тремя генерациями, всякие локальные переменные и мелкая требуха попадает в первую генерацию и чиститься первее всех. В го же оптимизация происходит на этапе компиляция, которая называется Escape Analysis, суть в которой, что многие объекты выделяются не на куче, а на стеке и сразу уничтожаются, что обнаруживается семантическим анализом их использования компилятором.
Передавать по ссылке версус Передавать по значению
Преждевременная оптимизация зло, потому ориентироваться на недокументированные оптимизации компилятора и гадание выделится ли структура на стеке или в куче не имеет смысла.
Я выработал концептуально такую систему:
1. Передавать структуру по значению, если мы предполагаем ее использование как иммутабельную (но тут не забывайте, что мапы и слайсы все равно будут мутабельны)
2. Передача ссылки предполагая, что объект будет изменяться функцией, в которую мы ее передаем
3. Понимать указатель как nilable (nullable) значение, чтобы проверить, мол не проинициализировано ли значение
4. Использовать указатели когда надо избежать копирования
В общем, как-то так
Je
Если указатель на структуру неоптимально, тогда почему методы в го реализованы через передачу указателя на структуру? Даже когда мутабельность не требуется
Roman
в интерфейсы подходят только ссылки на объекты
Roman
по значению можно передавать мелкие структуры
Cat
мы точно про го говорим?
Vladislav
Je
Je
вот пример https://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction
Nikita
А какие проблемы тут можно огрести?
Есть интерфейс
type Property interface {
Get() (value sometype)
Set(value sometype)
}
Метод Get() (value sometype) ты можешь имплементировать по значению (типа как бы подразумевая иммутабельность)
А Set(value sometype) по ссылке
Но в итоге если ты передаешь по ссылке, то ты все равно не сможешь его использовать как Property, т.к. Get будет определен по значению, а если по значению, то не сможешь из-за Set
Vladislav
Vladislav
Или я неправильно понял?
Je
у вас уже есть эмприческое правило на глаз как передавать структуру?
Je
почему бы всегда не передавать по указателю и не заниматься преждевременными оптимизациями?
Vladislav
Vladislav
Nikita
По ссылке можно.
нельзя, Get определен по-значению, смотри внимательно мой пример