Напишите программу, которая: a). Поочередно выполнит http запросы по предложенному списку ссылок
Условие
Заголовок раздела «Условие»Напишите программу, которая: a). Поочередно выполнит http запросы по предложенному списку ссылок
- в случае получения http-кода ответа на запрос «200 OK» печатаем на экране «адрес url - ok»;
- в случае получения http-кода ответа на запрос отличного от «200 OK» либо в случае ошибки печатаем на экране «адрес url - not ok». б). Модифицируйте программу таким образом, чтобы использовались каналы для коммуникации основного потока с горутинами. Пример:
- Запросы по списку выполняются в горутинах;
- Печать результатов на экран происходит в основном потоке.
- Модифицируйте программу таким образом, чтобы нигде не использовалась длина слайса урлов. Считайте, что урлы приходят из внешнего источника. Сколько их будет заранее - неизвестно. Сделать идиоматичный вариант, как ваша программа будет узнавать об окончании списка и передавать сигнал об окончании действий далee.
- Модифицируйте программу таким образом, чтобы при получении 2 первых ответов с «200 OK» остальные запросы штатно прерывались. При этом необходимо напечатать на экране сообщение о завершении запроса.
- Сделать отрефакторить код. Какие тесты написал бы к этому коду? Написать код теста и интерфейсы, для которых будут генериться моки.
- Какие вообще есть примитивы синхронизации в Go, как их можно использовать?
- Как используются закрытые каналы?
- Что будет если писать или читать в закрытый канал?
- Как сделать счетчик, агрегирующий информацию из разных горутин?
- Как использовать контекст?
- У нас есть база данных с паролями пользователей, пароли захешированы (функция hashPassword), а так же известен набор символов которые могут быть использованы в паролях (переменная alphabet). Наша задача реализовать функцию RecoverPassword так, чтобы она восстанавливала пароль по известному хэшу и TestRecoverPassword завершился успешно
import("crypto/md5 ""testing ")
var alphabet= []rune{'a', 'b', 'c', 'd', '1', '2', '3'}
func RecoverPassword(h[]byte) string{// TODO: implement mereturn""}func TestRecoverPassword(t*testing.T) {for _, exp:=range[]string{"a ","12 ","abc333d ",} {t.Run(exp, func(t*testing.T) {act:=RecoverPassword(hashPassword(exp))if act!=exp{t.Error("recovered:", act, "expected:", exp)}})}}func hashPassword(in string) []byte{h:=md5.Sum([]byte(in))return h[:]}- Как сделать подбор константным по сложности, если мы можем ограничьить длину пароля?
- Вычислительная сложность подбора пароля?
- Как атакующий может скомпрометировать криптосистему?
- Как разработчики сервиса могли бы усложнить подбор паролей?
- Что выведет на экран эта программа?
func main() { for i := 0; i < 5; i++ { go func() { fmt.Println(i) }() }}- Как можно было бы изменить программу чтобы каждая горутина правильно выводила свой индекс?
- Нужно написать простую библиотеку in-memory cache. Для простоты считаем, что у нас бесконечная память и нам не нужно задумываться об удалении ключей из него. Реализация должна удовлетворять интерфейсу:
type Cache interface { Set(k, v string) Get(k string) (v string, ok bool)}- Можно ли найти решение лучше?
- В каких случаях это будет работать медленно?
- Как шардировать данные?
- Сколько шардов нужно делать?
- Можно ли сделать еще более быстрый кэш, если у нас мало ключей и мы заранее знаем, что они идут от «1» до «10000» и других ключей не бывает?
- Это почти реальный пример из одного из наших сервисов. Этот код - обертка над кэшем, который соотвественно пишет и читает данные из кэша. Нe смотря на то, что внедрение данного кэша должно было облегчить основное ранилище, однако это не произошло. Почему?
type Storage struct { cache *lru.Cache}
func (s *Storage) Set(wh *warehouse.Warehouse) { s.cache.Put(wh.Id, *wh)}func (s *Storage) Get(id types.WarehouseId) *warehouse.Warehouse { item, ok := s.cache.Get(id) if ok { if wh, ok := item.(*warehouse.Warehouse); ok { return wh } } return nil}- Написать код функции, которая делает merge N каналов. Весь входной поток перенаправляется в один канал.
func merge(cs...<-chan int) <-chan int{...}- Что выведет данная программа? Она отработает корректно?
func main() { ch := make(chan int) go func() { for i := 0; i < 5; i++ { ch <- i } }() for n := range ch { fmt.Println(n) }}- Напишите функцию которая бы возвращала ошибку не импортируя для этого никаких пакетов:
func main() { println(handle())}func handle() error { // ...}- Что это такое pprof и зачем нужно?
- Как можно снять профили?
- Что такое семплирующий профайлер?
- Есть ли оверхед от использования pprof ’a?
- Что такое trace и чем он отличается от других профилей?
- Что видно на флеймграфе?
- Что выведет данный код?
m := map[string]int{"a ": 1, "b ": 2, "c ": 3}for a, b := range m { fmt.Println(a, b)}- В каких случаях данный код даст ошибку?
a := map[B]int{}a[d] = 0e, ok := a[d]- Какие типы в Go являются incomparable?
- Что такое интерфейс в Go? Как он устроен?
type Foo struct{}
func (f *Foo) A() {}func (f *Foo) B() {}func (f *Foo) C() {}
type AB interface { A() B()}
type BC interface { B() C()}
func main() { var f AB = &Foo{} y := f.(BC) // сработает ли такой type-assertion? y.A() // a этот вызов? _ = y}- Что такое «пустой интерфейс»(interface{})?
- Когда допустимо применять пустой интерфейс?
- Каковы основные отличия применения интерфейса в Go от интерфейсов классического ООП-языка (Java, C#, etc)?
- Чем горутины отличаются от потоков?
- Что можно сказать про стек горутины и стек потока?
- Cколько можно создать горутин?
- Что такое GOMAXPROCS?
- Что такое defer? Что выведет следующий код?
type X struct { V int}
func (x X) S() { fmt.Println(x.V)}
func main() { x := X{123} defer x.S() x.V = 456}- Что изменится, если изменить код?
...func main() {x:=X{123}defer func(){ x.S() }()x.V= 456}...- Что выведет данный код?
func main() { values := []int{1, 2, 3, 4, 5} for _, val := range values { go func() { fmt.Println(val) }() } time.Sleep(100 * time.Millisecond)}- Что такое замыкание? Приведите пример использования замыкания.
- Что такое mutex и зачем он нужен?
- Что такое каналы? Зачем нужны? Какие они бывают?
- К чему приведут операции чтения/записи над закрытым каналом?
- К чему приведут операции чтения/записи над nil каналом
- Какой еще способ блокировки навсегда?
- Что такое select и как он работает
- Другие примитивы синхронизации
- Как канал устроен внутри?
- Какие знаешь паттерны конкурентного программирования, использующие каналы
- Можно ли передать переменную в несколько горутин?
- Пример - что будет?
x := make(map[int]int, 1)go func() { x[1] = 2 }()go func() { x[1] = 7 }()go func() { x[1] = 10 }()time.Sleep(100 * time.Millisecond)fmt.Println("x[1] =", x[1])- Продемонстрировать решение без sync.Mutex/sync.RWMutex
- Какие знаешь средства для предотвращения RC?
- Какие mutex бывают и чем отличаются для чего нужны?
- Что такое слайс? Как он устроен?
- На что влияет параметр вместимости слайса cap?
- Как происходит выделение памяти при росте слайса через append? К каким негативным последствиям может неправильное понимание будущего размера слайса в момент его создания?
- Когда сборщик мусора удалит массив под слайсом?
- Какие особенности получения нового среза от ранее существующего слайса вы знаете?
- Чем опасно создание через make слайса с явно указанными len & cap?
- Что из себя представляет строка в Go?
- Чем отличается байт от руны в Go?
- Есть база с такой схемой данных
// user
id | firstname | lastname | birth1 | Ivan | Petrov | 1996-05-012 | Anna | Petrova | 1999-06-013 | Anna | Petrova | 1990-10-02
// purchaseid | price | user_id | date1 | 5500 | 1 | 2021-02-151 | 5700 | 1 | 2021-01-152 | 4000 | 1 | 2021-02-143 | 8000 | 2 | 2021-03-014 | 400 | 2 | 2021-03-02
// ban_list
user_id | date_from1 | 2021-03-08Решение
Заголовок раздела «Решение»Источник: Ozon / Озон (полный список, ч. 2) · 3 кв 2024
← Напишите SQL-запрос, который вернет кол… · Все задачи · Алгоритмы и структуры данных · Как ты думаешь, какая сложность данной… →