Niko
как в моем примере. 1. Имею строку с названием структуры test := "Test" 2. Создаю структуру с названием, которое содержится в строке test{number} или (new test())
Dmitry
Что значит "из строки"?
наверное ему нужна фабрика...
Niko
ага, нужна фабрика
Vasily
Так нельзя
Vasily
Это не пхп
Dmitry
как в моем примере. 1. Имею строку с названием структуры test := "Test" 2. Создаю структуру с названием, которое содержится в строке test{number} или (new test())
Ты, вероятно, из пхп? Вроде там такое сделать можно, но это прям беда. Лучше просто switch/if/map из строки и интерфейса
Niko
ok. Пошел делать switch
Dmitry
func BuildObject(name string) IObject { switch name { case "Apple" : return &Apple{} case "Banana": return &Banana{} } return nil }
Dmitry
типа того
Niko
@Am1rkin спасибо
Dmitry
@Am1rkin спасибо
скорей всего тебе это не нужно, ты пытаешься понимание других языков перенести в Го, не надо так ☝️
Мерль
@Am1rkin спасибо
Ещё посмотри в сторону интерфейсов, тебе они понадобятся
ceiling cat
Разве нельзя эту задачу с помощью интерфейсов сделать? без switch/case?
Мерль
Разве нельзя эту задачу с помощью интерфейсов сделать? без switch/case?
Что значит "без switch"? Интерфейссы и условные переходы — это ортогональные штуки
Niko
Я действительно переношу код из пхп Может и можно, но я пока не знаю как правильно писать на го
Niko
Я прошел
Niko
Стало проще)
Dmitry
кстати, вот тут поясняется, что возвращать интерфейсы это плохо https://github.com/golang/go/wiki/CodeReviewComments#interfaces
Vladimir
конечно плохо )
Vladimir
а кто-то говорит что хорошо?
Anatoly
https://github.com/golang/go/wiki/CodeReviewComments #mustread
Valentin
А почему плохо, если конструктор вернет интерфейс? Так компилятор и IDE проверяют, что структура реализует интерфейс верно
Мерль
⏺ Vаdim
как присвоить string через рефлексию значению типа nullString? If structValue.Type().String() == "sql.NullString" { structValue.SetString(valueString) /// Так не получается return nil }
Anton
А почему плохо, если конструктор вернет интерфейс? Так компилятор и IDE проверяют, что структура реализует интерфейс верно
лучше всегда возвращать more specific type. covariant type parameter should be most often used as output type (in producers) and contravariant type parameter as input type
Anonymous
как к примеру в джава мире. Правильнее вернуть Map. Вместо HashMap
Igor
Плохо потом мокать и тестировать, но хорошо для драйверов, разных логгеров, и т.п. - всему своё место
Anton
Разве не наоборот ?
я постоянно это путаю. *краснею* пойду проверю, то ли я написал
Igor
Ну и это специфично для котрибуции в либы компилятора 🙂
engelbart
Что то я не допонимю с vendor папкой
Мерль
как к примеру в джава мире. Правильнее вернуть Map. Вместо HashMap
Если ты захочешь расширить возвращаемый тип, то в случае интерфейса тебе придётся делать чёртову кучу работы, а в случае конкретной структуры — всего лишь добавить методов в её определении. К тому же, ты всегда можешь привести тип к интерфейсу, а вот вытащить тип из интерфейса — довольно геморройная задача
engelbart
Наличие пакета в vendor, избавляет меня от необходимости иметь либу в GOPATH/src или нет?
Niko
Как проверить, если ли элемент в карте??? type Test struct { } func (t *Test) isInMap(p *string) (int, bool) { return t.getMaps()[p] } func (t *Test) getMaps() map[string]int { return map[string]int{ "TEST": 0, } }
Constantine️
ok тебе в дорогу ))
Niko
мне не нужен elem, а просто проверить есть ли ключ в карте на bool
Niko
Нельзя ли вернуть из метода _, exists := yourMap[key]??? Ведь в exist уже нужный мне bool, зачем делать потом if
Мерль
Разве "Program to an interface, not an implementation" в го не работает? Интерфейсы настолько часто меняются?
Нет, меняются не часто, и конечно этот принцип работает, просто удобнее принимать интерфейсы, а отдавать конкретные типы данных. Меньше работы при рефакторинге потом
Anton
Разве не наоборот ?
блин, в summary написано так как я написал (вроде даже оттуда дергнул) http://blog.kamkor.me/Covariance-And-Contravariance-In-Scala/
denisx
ребята привет
denisx
нуб-вопросы можно?
Мерль
И как часто нужно расширять тип?
нечасто, но когда понадобится — будет жопа
Anonymous
Anonymous
нечасто, но когда понадобится — будет жопа
Ну эт видимо проблема в го такая
denisx
вроде да
Dmitry
вроде да
теперь effective go пройди:)
denisx
ахаха )
Anonymous
Давай свои вопросы
Мерль
Ну эт видимо проблема в го такая
ну, если у тебя есть пять имплементаций интерфейса, и если ты меняешь интерфейс, то тебе придётся менять все свои имплементации и в жабке тоже, нет?
denisx
у меня в одном пакете создаётся коннект к базе. а в другом пакете я делаю pgx.PreparedStatement.
Мерль
Да, и это нормально
А зачем? В чём профит возвращать интерфейс?
Niko
@twentydraft func (t *Test) isInMap(p *string) (exist bool) { myMap := t.getMap() return _, exist := myMap[p] } говорит, что myMap[p] evaluated but not used
Dmitry
А зачем? В чём профит возвращать интерфейс?
Я понимаю, что это немного не из го мира, но как хотя бы абстрактную фабрику без возвращения интерфейса сделать?
denisx
так вот из того, с базой, не могу вытащить эти PreparedStatement, пишет Cannot use godb.Prepare("GetPageByURI", getPageByURI) (type *pgx.PreparedStatement) as type *pgx.PreparedStatement in assignment
Niko
ща
Мерль
@twentydraft func (t *Test) isInMap(p *string) (exist bool) { myMap := t.getMap() return _, exist := myMap[p] } говорит, что myMap[p] evaluated but not used
@twentydraft func (t *Test) isInMap(p *string) (exist bool) { myMap := t.getPatterns() _, exists := myMap[p] return exists }
Niko
я там по ссылке значение передал. сейчас еще пробую
denisx
так вот из того, с базой, не могу вытащить эти PreparedStatement, пишет Cannot use godb.Prepare("GetPageByURI", getPageByURI) (type *pgx.PreparedStatement) as type *pgx.PreparedStatement in assignment
даже вот так cannot use godb.Prepare("GetPageByURI", getPageByURI) (type *"github.com/XXX/godb/vendor/github.com/jackc/pgx".PreparedStatement) as type *"github.com/jackc/pgx".PreparedStatement in assignment
Anonymous
Ага, что-то с вендорингом...
denisx
пробовал наоборот, но тут go не дает, говорит залезать в вендоры пакетов нельзя
Niko
@twentydraft Reports assignment with no new valiables on left side подчеркивает мои _, exist в строке _, exist := myMap[p]
Dmitry
:= замени на =
exist у тебя уже объявлен
Niko
@Am1rkin Получилось, но где он был объявлен?