Роман
Роман
Немного не понял
Так, ладушки. Сейчас тогда почта про это. Спасибо.
Sergey
Всем привет, кто может объяснить? runtime.GOMAXPROCS(1) wg := sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { fmt.Println(i) wg.Done() }(i) } wg.Wait() вывод всегда, не зависимо от количества итераций: 9 0 1 2 3 4 5 6 7 8 Максимальный элемент всегда в начале. Вроде шедулер работает по приниципу fifo.
Dmitry
Всем привет, кто может объяснить? runtime.GOMAXPROCS(1) wg := sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { fmt.Println(i) wg.Done() }(i) } wg.Wait() вывод всегда, не зависимо от количества итераций: 9 0 1 2 3 4 5 6 7 8 Максимальный элемент всегда в начале. Вроде шедулер работает по приниципу fifo.
не нужно гадать, как работает шедулер. в какой-то следующей версии его могут изменить. прога не должна надеятся на конкретную последовательность в этом примере. иначе нужно переписывать прогу
Sergey
ну меня вопрос чисто исследовательского характера)
Илья
Там кешируются результаты: если не изменить код, то будешь получать одинаковый
Sergey
это у себя на машине
Vladimir
Добрый день. Подскажите, пожалуйста. вот тут пример - https://go.dev/play/p/wk5kQaFT_4j Не могу понять: - Либо как определить InitObj вне case. - Либо как внутри case определить переменную InitObj, чтобы ее область видимости позволила сделать return из функции
Dmitry
Добрый день. Подскажите, пожалуйста. вот тут пример - https://go.dev/play/p/wk5kQaFT_4j Не могу понять: - Либо как определить InitObj вне case. - Либо как внутри case определить переменную InitObj, чтобы ее область видимости позволила сделать return из функции
вне switch определяется как var InitObj interface внутри кейса создается новая переменная. в ObjectMeta добавляется нужная структура. далее в InitObj присваивается новая переменная
Null
🔥 Хардкорный тест для Web-разработчиков 🔥 🚀 Ответьте на 20 вопросов и проверьте, насколько вы готовы к обучению на курсе - «Golang Developer. Professional» 💻 За 5 месяцев вы научитесь использовать Golang для создания отказоустойчивой микросервисной архитектуры, писать production-ready код, многопоточные и конкурентные программы. разберем внутренние механизмы Go и проблемы, с которыми сталкиваются в реальности. 💎 Какой результат вы получите? - Сможете писать production-ready код, многопоточные и конкурентные программы. - Будете понимать синтаксис и внутреннее устройство языка Go. - Сможете разворачивать микросервисы с помощью docker. - Создадите собственный микросервис на Go. 👉 ПРОЙТИ ТЕСТ https://otus.pw/hmdt/ 💣 Пройдете тест, получите демо-ролик о занятиях на курсе и Welcome-скидку. ✅ Также вам откроется доступ к 2 открытым урокам курса: ✔️ Тестирование в Go ✔️ Дженерики в Go Забыл совсем, к каждому посту дописываем: Реклама. Информация о рекламодателе на сайте www.otus.ru
Vladimir
т.к. вернуть я могу только что-то типа OBJ
Dmitry
Тогда InitObj будет определен как интерфейс и я не смогу его вернуть
а как вы его хотите вернуть, если в этой переменной у вас могут быть разные типы?
Vladimir
По факту я хочу в switch пробежаться по всем возможным типам и вернуть то, что определиться в case
Vladimir
пишу и понимаю, что использование дженериков в таком формате, скорее всего, нецелесообразно)
Dmitry
пишу и понимаю, что использование дженериков в таком формате, скорее всего, нецелесообразно)
насколько я понял, дженерики нужны, чтобы в одном виде написать функцию, и она работала для подобных типов, например int, int8, int32, int64.
Dmitry
а для того, что вы хотите сделать - это можно делать через интерфейс, а в месте использования кастовать к нужному типу
Vladimir
хм. Можно пример?
Dmitry
либо использовать рефлексию, но это сложно
Dmitry
хм. Можно пример?
как я посоветовал возвращать interface, а в месте, где используется конкретный объект делать obj.(*appsv1.DaemonSet)
Vladimir
понял! Спасибо
Иван
а может там интерфейсы одинаковые у обьектов, или не
Иван
выглядит как абстрактная фабрика без абстракции хд
Vladimir
но интерфейсы не реализуют возможность заполнения ObjectMeta
Иван
но интерфейсы не реализуют возможность заполнения ObjectMeta
о, а вот где нужно заполнение objectMeta можно заюзать дженерики
Vladimir
То есть функция на хвод которая получает интерфейс, внутри приводит этот интерфейс к нужному типу (дженерик) заполнет objectMeta и отдает?
Иван
может проще указатель на структуру передать и там внутри все заполнить, хз
Иван
я не пробовал такое делать
Maks
Псс
Victor
добрый день. вопрос касательно дизайна языка, а именно generics. кто-то видел где-нибудь детальное объяснение, почему approximation constraint (~T) сделан таким, что его можно применять только с predeclared types? Т.е. нельзя сделать type MyInt int func Max[T ~MyInt](sequence []T)
Artur
Новая, седьмая, часть создания production сервиса на Go. https://youtu.be/InFf_n7VM1o
Victor
А в чем может быть логика создавать алиас на алиас, разве это только не сильнее код запутывает?
я привел слишком искусственный пример, конечно. более длинный пример из Type Parameters Proposal: func Double[E constraints.Integer](s []E) []E { r := make([]E, len(s)) for i, v := range s { r[i] = v + v } return r } type MySlice []int var v1 = Double(MySlice{1}) // тип v1 будет []int а не MySlice func DoubleDefined[S ~[]E, E constraints.Integer](s S) S { // Note that here we pass S to make, where above we passed []E. r := make(S, len(s)) for i, v := range s { r[i] = v + v } return r } var v2 = DoubleDefined(MySlice{1}) // вот здесь уже тип v2 будет MySlice и объявить функцию по-другому, чтобы добиться результата в последнем примере, не получится, тильду нельзя применить к интерфейсам либо к типам, которые не являются своими собственными underlying types.
Victor
func DoubleDefined[S ~[]E, E constraints.Integer](s S) S - достаточно многословное объявление, хотелось бы покороче. поэтому интересно, почему они сделали именно так. я еще не до конца дочитал Type Parameters Proposal, если что.
Grand
всем привет! у меня есть интерфейс type ServiceI interface { func DoSomeThing(...) error} пытаюсь тестировать моками это все. Сгенерировал их с помощью mockgen, пытаюсь писать вот так: func TestService_DoSomeThing(t *testing.T) { ctl := gomock.NewController(t) defer ctl.Finish() servI := mocks.NewMockServiceI(ctl) // ... // servI.EXPECT().DoSomeThing(...).Return(...).Times(1) } что дальше надо сделать? пытался сдеать serv:=ServiceI(servI), потом вызвать метод DoSomeThing для serv. Запутался, помогите зеленому
Grand
ну да, вызываешь serv
а почему тогда coverage самого кода в файлике Service.go в котором лежит интерфейс и методы 0%? это как понять?
Илья
а сам тест проходит?
Grand
да
kostyaBro
Новая, седьмая, часть создания production сервиса на Go. https://youtu.be/InFf_n7VM1o
Не нравится мне как это парень делает структуру папок
kostyaBro
Не нравится мне как это парень делает структуру папок
https://youtu.be/fx6NWIgjH7w Вот тут, например хорошие советы
kostyaBro
Имхо
kostyaBro
почему?
В двух словах, потому что по папкам не понятно о чем проект.
kostyaBro
Понятно из чего он. По итогу все проекты выглядят одинаково. Возможно дело вкуса и почерка но все же
Artur
Понятно из чего он. По итогу все проекты выглядят одинаково. Возможно дело вкуса и почерка но все же
и эта одинаковость дает прирост в скорости ориентации и доработки/фиксов.
kostyaBro
Точнее не так
Artur
https://youtu.be/fx6NWIgjH7w Вот тут, например хорошие советы
это java/kotlin, там все по другому. там ООП есть. я пытался это переложить на Go - вышло прикольно, но смысла было немного
kostyaBro
Одинаковость будет
kostyaBro
Просто другая одинаковость
kostyaBro
И ты сразу открываешь проект и видишь что где
Artur
И ты сразу открываешь проект и видишь что где
я открываю папку domain и вижу что где)
Artur
открываю папку controllers и вижу весь транспорт
kostyaBro
Грубо говоря открываем проект видим bounded contexts. А глубже уже видим контроллеры контекста если они есть, модель и тп
kostyaBro
Согласен с тобой, говорю что дело почерка и субъективно. Но в твоем случае не видно bounded contexts
kostyaBro
не понимаю почему не видно. в папке domain все есть
Все части каждого контекста размазаны по всему коду
Artur
это монолит еси шо)
Artur
Все части каждого контекста размазаны по всему коду
эммм нет. есть сервисы, где 1 сервис —> 1 entity есть policy (usecase), которые объединяют логику с entities и включают в себя разные сервисы
Artur
Artur
по крайней мере того, который все знают)
Artur
а не тот что имел ввиду Алан Кей когда придумал ООП
Юрий
хорошо, что поправили, а то вас бы живьем съели
kostyaBro
Я написал "достаточно для того о чем речь"
Artur
:-P
kostyaBro
в го нет полноценного ооп)
Но есть неполноценный))
Artur
не, в нем есть композиция и встраивание
Artur
но не ооп)
kostyaBro
это монолит еси шо)
Ну слушай, видно, согласен Просто дело вкуса Ты в папках домен контроллер и прочее делишь на контексты, а я делю на контексты а в ниж уже сервис клиент прото и тд Вообще я ещё просто не люблю когда используются названия контроллер и тп.ну и в моей структуре они и не нужны практически
kostyaBro
я и так и так делаю и в том и в другом случае вижу плюсы и минусы и все еще не определился… =)
Я щя понял что определился потому что ты как на бумажке пилишь домен на поддомены на поддомены, потом на чтото гексагональное например, так и с папками. И интересный момент, если решишь вынести в отдельную репу модуль как сервис, проще ctrl C ctrl V нажать