Daniel
зачем?!
Pawel
для домашних проектов же) почему нет? он классный
Daniel
мне не интересно про гуй
Daniel
иногда он нужен, но я бы предпочел уделить ему минимум времени
Daniel
совсем минимум
Stanislav
+1, фронтенд постоянно лезет в мои бекендовые чатики ☹️
где тут «бэкендовый чатик»? я не вижу названия «Hey, Golang RU Backend», а ты? (:
Daniel
и это печаль
Cenator 🐈
Cenator 🐈
Вообще у норм людей щас фронт и бэк общаются через апи
Stanislav
@jhekasoft я тебе скажу так: 1. GTK - удобно и легко писать, можно даже сделать приложение go get-абельным. Но совершенно вырвиглазный гуй для макоси. 2. Qt5 - единственное, что вменяемо умеет мимикрировать под родной гуй каждой оси. Код писать сложновато порой. 3. zserge/webview годно, памяти жрет куда меньше, чем nw.js и электроны, из минусов - забудь про системные меню, трей придется реализовывать сторонним пакетом, и т.д. и т.п. Это только webview и не более. 4. andlabs/ui откровенная срань, имел дело, больше не хочу. Остальное либо для эмбеддеда, либо для игроделов. Либо настолько крейзанутое API, что куда спокойнее будет написать на Qt5.
Pawel
gopherjs к примеру :)
нет нормальног биндинга для реакта и apollo js. без этого никакой фронтенд сейчас невозможен
Stanislav
(это ответ на последнюю часть фразы)
Cenator 🐈
А для go есть graphql сервер?
Eugene
Вот как выглядит Qt (слева), GTK+ 3 (справа) на МакОси.
Sergey
Ребят, всем привет! Может кто знает, почему изображение переворачиватеся влево после кропа или/и ресайза?
Andrey
код?
Andrey
хотяб библиотеку сказал :)
Sergey
Рукими писал, и всеми возможными библеотеками
Sergey
ничего сврехестественного, протсо результат соранения надис перевернут
Sergey
кажется нашел шершение, дело в Exif тегах, сейчас попробую решить
Zver
Ребят, всем привет! Может кто знает, почему изображение переворачиватеся влево после кропа или/и ресайза?
Оно возможно и было повернуто, если от куда-нибудь из фотоаппарата или телефона, просмотрщики многие делают автоповорот по данным Exif. Так что нужно сохранять тег эксифовский, или самому поворочивать в соответствии с ним и отбрасывать.
heavycharged
господа, подскажите как сделать, пишу CSV файл, и есть например набор столбцов которые нужно записать. Я хочу сделать что-то вроде враппера, которому я передаю некоторый список полей (функций), они сначала пишут Header, а затем при добавлении товаров эти же функции принимают в себя сущность, и пишут значения этой сущности. Если запутанно, то концепция такая: func (builder CSVBuilder) WriteHeader(funcs ...ExtractorFunc) { и используют так builder.WriteHeader(ProductID, ProductName, ProductPrice, ProductImages) после чего передаю в билдер товары builder.AddOffer(MyProduct) и для него вызываются методы, что-то вроде func Value(p ProductID) string {return strconv.Itoa(p.ID) }
heavycharged
основной затык с интерфейсами и функциями первого класса. хочу ну функцию объявить метод Header() string
heavycharged
но не могу понять как это осуществить
Daniel
чет не понятно
Daniel
зачем это все?
heavycharged
Ну, а как по другому сделать? через мапу что-ли?
heavycharged
Задача короче, писать сначала хидер, а потом и поля для товаров
heavycharged
при этом дать какую-то гибкость
heavycharged
чтобы если мне нужно добавить поля, я определил функцию, и она разрулит сама все.
heavycharged
а не писать ручками csv.Write([]string{...., "New Field"), и потом топать в цикл и там ещё дописывать нужное поле
heavycharged
Короче, вопрос в следующем, можно ли как-то сделать type MyFunc func() которая бы при этом реализовывала какой-то интерфейс?
Daniel
что такое реализовывала интерфейс?
Daniel
если вы определили тип как func, и передаете параметром переменную этого типа, передать функцию, которая имеет другой набор параметров и возвращаемых значений вам не дадут
heavycharged
нужно что-то вроде таких вот функций type Getter func(product Product) string func (Getter) Header() string { return "Some header" } Я просто делаю так: csv.Export(ProductID, ProductName) // ProductID и ProductName - функции, при вызове которых возвращает строку для записи заголовка csv файла далее я передаю в в csv файлик свои товары, например так: csv.AddProduct(product) и уже для этого товара вызываются функции ProductID, ProductName, только например метод, в который передается product, из него вытягивается нужное поле, конвертится в строку, и пишется в файл.
heavycharged
видимо, нихера такое не выйдет, нужно либо структуры удовлетворяющие интерфейсы (Header() string и Value(Product) string) передавать
Daniel
вы бы ответили для начала на вопрос - зачем это все?
Daniel
я подозреваю, что просто задача поставлена невнятно, и в ней нашлось место для неуместной генерализации
Daniel
обычно надо решать задачу как можно уже
Daniel
но иногда из ТЗ можно высосать странное
heavycharged
Смотрите, я может повторюсь. Я хочу один раз указать, что я собираюсь записать файл, и затем передавать туда сущность. И все.
Daniel
ну
Daniel
у сущности есть структура
Daniel
у сущности есть теги
Daniel
этого достаточно, чтобы написать любой csv
heavycharged
окей, а если мне не нужно экспортировать часть полей? Мне удалять теги, или писать вот так csv:"-"?
Daniel
так и писать, да
heavycharged
я хочу пакет, который я просто подключил бы. мне часто приходится писать конвертеры товаров из движка А в движок Б, из формата А в формат Б. Я просто пишу a-to-b converter, и все. Я не хочу лазить в этот пакет больше одного раза, и тем более не хотелось бы там теги редактировать.
Sergey
В вашем случае либо интерфейс с header value либо извращения
Sergey
Теги не всегда выход, например структура одна а файлов три вида с разным набором
heavycharged
я вот такое как бы вижу, и оно сработает: csv.WithFields(ProductID{}, ProductName{}, ProductPrice{}) Но сюда приходится передавать структуры, и эти скобки немного бесят, а я бы хотел прям функции указывать.
Zver
Данные к вам в каком виде приходят?
Sergey
Можно функцию которая при получении nil выдаёт хидер а если указатель на структуру то значение, но это плохо
heavycharged
с нилом я тоже думал, но это в каждой функции if product == nil {, это ещё хуже скобок :(
heavycharged
Данные к вам в каком виде приходят?
данные приходят в разных форматах, это может быть и выборка из базы сразу в Product{}, или csv, json, xml/yml.
heavycharged
сейчас это yml.
heavycharged
я его конвертнул в промежуточный Product{}
Zver
Как продукт ваш выглядит?
Daniel
все остальные способы устроить генерализацию будут костыльными и потому слегка мутными
heavycharged
Как продукт ваш выглядит?
type Offer struct { XMLName xml.Name `xml:"offer"` Available bool `xml:"available,attr"` ID int `xml:"id,attr"` Name string `xml:"name"` CategoryID int `xml:"categoryId"` Price float64 `xml:"price"` CurrencyId string `xml:"currencyId"` Pictures []string `xml:"picture"` Vendor string `xml:"vendor"` VendorCode int `xml:"vendorCode"` CountryName string `xml:"country"` Description string `xml:"description"` Params []Param `xml:"param"` } что-то вроде этого, но это не промежуток, это просто сущность yml файла. я её передаю в csv. промежуточный product написан, но он в этой цепочке не участвует пока.
heavycharged
https://pastebin.com/43s1dLcC
heavycharged
вот конвертер, соре за портянку :(
Zver
У вас данные всегда имют табличный вид?
Zver
Структура у вас всегда известна до начала обработки файла?
heavycharged
что вы имеете ввиду под табличным видом? Например, здесь CategoryID это int, но на выходе будет не int, а что-то вроде Главная///Товары для дома///Утюги///Чугунные Структура всегда известна, моя задача описать некий алгоритм конвертации из одного формата в другой, при этом как-то максимально делкаративно сделать.