Cat
в общем, это тот же старый спор про иммутабельные данные в го
Brommie
список обработался нормально
скинь результат плиз)
Kirill
осталось на сегодня ещё один извечный холивар
Kirill
джжжжжеееенееееее...
Мерль
😈
Kirill
ща зобаню
эхехехехе
Мерль
в общем, это тот же старый спор про иммутабельные данные в го
я пришёл к тому, что часто создаю кастомные типы для коллекций Например, type FooList []Foo и реализую для них наборы методов, чаще всего Copy, Filter и проч
Kirill
я пришёл к тому, что часто создаю кастомные типы для коллекций Например, type FooList []Foo и реализую для них наборы методов, чаще всего Copy, Filter и проч
Sort, Map, ForEach, Includes, Find, Concat, CopyWithin, Entries, Every, Fill, FindIndex, FlatMap, Flatten, IndexOf, Join, Keys(), LastIndexOf, Pop, Push, Reduce, ReduceRight, Reverse, Shift, Slice, Some, Splice, ToLocaleString, ToSource, ToString, Unshift и Values? :))
Мерль
Sort, Map, ForEach, Includes, Find, Concat, CopyWithin, Entries, Every, Fill, FindIndex, FlatMap, Flatten, IndexOf, Join, Keys(), LastIndexOf, Pop, Push, Reduce, ReduceRight, Reverse, Shift, Slice, Some, Splice, ToLocaleString, ToSource, ToString, Unshift и Values? :))
Неа, у меня простая эвристика: если применил какую-то операцию два и более раз, и знаю, что понадобится ещё раз, то выношу ещё в метод
Daniel
да ладно
Daniel
вот прям "никак"
Kirill
Так это, Map и Reduce без дженериков никак
дык для каждого отдельного типа коллекции
Daniel
кодогенерацию отменили, наверное
Kirill
руки отрезают за такое
Kirill
и по самые дженерики
Мерль
Чаще всего это Copy и Filter, получение списка значений каких-нибудь полей (например Names), преобразование в Set например или преобразование в слайс другого типа
саша
да ладно
Ну да, у мапа же тип - map :: [a] -> (a -> b) -> [b]
Мерль
кодогенерацию отменили, наверное
ну будем честны, для кодогенерации чего-нибудь типа Copy нужен сильно умный кодогенератор и потом, мне кажется инфрастуктура кодогенераторов на го не то чтобы мертва, её просто нет
Мерль
go away()
ыхыхых
саша
Ну да, у мапа же тип - map :: [a] -> (a -> b) -> [b]
Ну как вариант для каждого отображения в каждый тип отдельный Map генерить. MapToString, MapToInt и т.д..
Daniel
имано
Мерль
да ладно тебе, вот прям сильно умный
ну ладно, не прямо умный, но всё таки есть нюансы
Мерль
Copy() вообще можно и в рантайме делать, если производительность позволяет
с одной стороны да с другой стороны на самом деле было бы хорошо впилить в Go ковариантность-контравариантность для интерфейсов это не сломало бы обратную совместимость, но позволило бы сделать интерфейс Copy например
Мерль
и это безо всяких дж
Мерль
хотя там тоже блин есть нюансы
Kirill
и их будет больше
Kirill
изначально ковариантность - способ переноса наследования типов на производные типы
Kirill
а у нас наследования-то по большому счёту нет
Kirill
тут значит потребуется концепцию дорабатывать
Kirill
чтобы она всё-таки была более применимой к го
Kirill
я могу назвать три языка, где есть ковариантность
Мерль
зачем?
просто сделать простейший вариант что-то типа var foo func(io.Reader) fmt.Stringer = func(*bytes.Buffer) *bytes.Buffer
Мерль
Kirill
а чем текущая не устраивает?
тем, что не ясно, как её в конце концов вкручивать в язык
.
Есть такой результат pprof
.
Кто нибудь может обьяснить, как это вообще читать?)
.
Исходя из него я не могу понять что сколько времени занимает
Kirill
видимо, частота опроса раз в 10мс
.
Разве не должно быть показано сколько каждый вызов занимает времени?
.
везде 0 of 10ms
.
Собственно как я сделал: запустил go tool pprof, сделал один запрос и подождал пока отобразится пикча
.
Так как мне увидеть сколько времени занимает каждый вызов?
Kirill
замерить нормально?
.
Как это сделать?)
.
Подскажи пожалуйста
Kirill
я иногда юзаю такой шорткат https://github.com/kirillDanshin/myutils/blob/master/cpuprof.go
Kirill
в нужном месте кода defer myutils.CPUProf()()
.
А как то без манипуляций в коде нельзя?
Kirill
точные результаты нельзя получить без точных замеров. сможешь получить точные замеры без изменений в коде - молодец %)
Мерль
выглядит хорошо
смотри допустим у нас есть контр- и ковариантность пусть Foo и Bar — это подтипы Beer тогда что делать со следующим кодом? var beers []Beer = []Foo{...} beers[0] = Bar{}
Pawel
херня получается, размер элемента массива не совпадёт. Понел, спасиб)
Pawel
ну тогда может только для лямбд и функ. типов
Мерль
херня получается, размер элемента массива не совпадёт. Понел, спасиб)
есть выход — сделать read only коллекции но это уже не просто
Мерль
ну тогда может только для лямбд и функ. типов
вот на уровне интерфейсов это более менее сработало бы, да
Pawel
есть выход — сделать read only коллекции но это уже не просто
или ещё вариант - разрешить ковариантность с массивами, но только для массовов указателей
Мерль
type Beer func(io.Reader) func Foo(*bytes.Buffer){...} var beer Beer = Foo beer(os.File)
Pawel
))))
Мерль
type Beer func(io.Reader) func Foo(*bytes.Buffer){...} var beer Beer = Foo beer(os.File)
... не сработает, потому что я фуфел и надо так ``` type Beer func(io.ReadCloser) func Foo(io.Reader){...} var beer Beer = Foo beer(os.File) ```
Мерль
потому что контрвариантность
Kirill
почему этот пример мне напоминает вот эту картинку
Kirill
Brommie
фиг там)
Brommie