Роман
Andrey
Артем
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
Sergey
ну меня вопрос чисто исследовательского характера)
Илья
Илья
Там кешируются результаты: если не изменить код, то будешь получать одинаковый
Sergey
это у себя на машине
Vladimir
Добрый день.
Подскажите, пожалуйста.
вот тут пример - https://go.dev/play/p/wk5kQaFT_4j
Не могу понять:
- Либо как определить InitObj вне case.
- Либо как внутри case определить переменную InitObj, чтобы ее область видимости позволила сделать return из функции
Dmitry
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
Vladimir
т.к. вернуть я могу только что-то типа OBJ
Vladimir
По факту я хочу в switch пробежаться по всем возможным типам и вернуть то, что определиться в case
Vladimir
пишу и понимаю, что использование дженериков в таком формате, скорее всего, нецелесообразно)
Dmitry
пишу и понимаю, что использование дженериков в таком формате, скорее всего, нецелесообразно)
насколько я понял, дженерики нужны, чтобы в одном виде написать функцию, и она работала для подобных типов, например int, int8, int32, int64.
Dmitry
а для того, что вы хотите сделать - это можно делать через интерфейс, а в месте использования кастовать к нужному типу
Vladimir
хм. Можно пример?
Dmitry
либо использовать рефлексию, но это сложно
Dmitry
хм. Можно пример?
как я посоветовал возвращать interface, а в месте, где используется конкретный объект делать obj.(*appsv1.DaemonSet)
Vladimir
понял! Спасибо
Иван
а может там интерфейсы одинаковые у обьектов, или не
Иван
выглядит как абстрактная фабрика без абстракции хд
Vladimir
Vladimir
но интерфейсы не реализуют возможность заполнения ObjectMeta
Vladimir
То есть функция на хвод которая получает интерфейс, внутри приводит этот интерфейс к нужному типу (дженерик) заполнет objectMeta и отдает?
Иван
может проще указатель на структуру передать и там внутри все заполнить, хз
Иван
я не пробовал такое делать
Maks
Псс
Victor
добрый день. вопрос касательно дизайна языка, а именно generics. кто-то видел где-нибудь детальное объяснение, почему approximation constraint (~T) сделан таким, что его можно применять только с predeclared types? Т.е. нельзя сделать
type MyInt int
func Max[T ~MyInt](sequence []T)
Andrey
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
Sanity = nil
kostyaBro
Имхо
kostyaBro
почему?
В двух словах, потому что по папкам не понятно о чем проект.
kostyaBro
Понятно из чего он.
По итогу все проекты выглядят одинаково.
Возможно дело вкуса и почерка но все же
Artur
kostyaBro
kostyaBro
Точнее не так
kostyaBro
Одинаковость будет
kostyaBro
Просто другая одинаковость
kostyaBro
И ты сразу открываешь проект и видишь что где
Artur
Artur
открываю папку controllers и вижу весь транспорт
kostyaBro
Грубо говоря открываем проект видим bounded contexts.
А глубже уже видим контроллеры контекста если они есть, модель и тп
kostyaBro
Согласен с тобой, говорю что дело почерка и субъективно.
Но в твоем случае не видно bounded contexts
Artur
Artur
kostyaBro
Artur
Artur
по крайней мере того, который все знают)
Artur
а не тот что имел ввиду Алан Кей когда придумал ООП
Юрий
хорошо, что поправили, а то вас бы живьем съели
kostyaBro
Я написал "достаточно для того о чем речь"
Artur
Artur
Artur
:-P
kostyaBro
Artur
не, в нем есть композиция и встраивание
Artur
но не ооп)
kostyaBro
Ну слушай, видно, согласен
Просто дело вкуса
Ты в папках домен контроллер и прочее делишь на контексты, а я делю на контексты а в ниж уже сервис клиент прото и тд
Вообще я ещё просто не люблю когда используются названия контроллер и тп.ну и в моей структуре они и не нужны практически
Artur
Artur