cookie

Sizning foydalanuvchi tajribangizni yaxshilash uchun cookie-lardan foydalanamiz. Barchasini qabul qiling», bosing, cookie-lardan foydalanilishiga rozilik bildirishingiz talab qilinadi.

avatar

Библиотека Go для собеса | вопросы с собеседований

Вопросы с собеседований по Go и ответы на них. Список наших каналов: https://t.me/proglibrary/8353 Учиться у нас: https://proglib.io/w/907158ab Обратная связь: @proglibrary_feedback_bot По рекламе: @proglib_adv Прайс: @proglib_advertising

Ko'proq ko'rsatish
Reklama postlari
4 287
Obunachilar
+924 soatlar
+447 kunlar
+23430 kunlar
Post vaqtlarining boʻlagichi

Ma'lumot yuklanmoqda...

Find out who reads your channel

This graph will show you who besides your subscribers reads your channel and learn about other sources of traffic.
Views Sources
Nashrni tahlil qilish
PostlarKo'rishlar
Ulashishlar
Ko'rish dinamikasi
01
💬 Когда процесс в Linux может не реагировать на SIGKILL? 🔸 Когда процесс является зомби-процессом, который уже завершился, но не освободил свои ресурсы. Зомби не может принимать сигналы и ожидает, что его родительский процесс считает его статус с помощью системного вызова wait. 🔸 Когда процесс находится в состоянии блокировки. Он выполняет неотменяемый системный вызов, такой как ожидание ввода-вывода или другого события, которое не наступило. Процесс не может завершиться, пока операционная система не вернет его в нормальное состояние. 🔸 Когда процесс является процессом init. Он не получает от ОС сигналов, которые не хочет обрабатывать. Процесс init может игнорировать SIGKILL, так как он является особым процессом, который отвечает за запуск и завершение других процессов.
89816Loading...
02
💬 Почему crypto/rand в некоторых кейсах предпочтительнее использовать вместо math/rand для генерации ключей в Go? Когда мы работаем над проектами, связанными с генерацией ключей, будь то для шифрования или для создания уникальных идентификаторов, важны качество и безопасность этих ключей. Пакет math/rand отлично подходит для генерации псевдослучайных чисел. Но у этого метода есть серьезный недостаток: если кто-то узнает, как генерируются числа (начальное значение seed), он сможет предсказать будущие числа. import "math/rand" func Key() string { // rand.Seed(time.Now().UnixNano()) // deprecated r := rand.New(rand.NewSource(time.Now().UnixNano())) buf := make([]byte, 16) for i := range buf { buf[i] = byte(r.Intn(256)) } return fmt.Sprintf("%x", buf) } Даже если мы инициализируем генератор с чем-то вроде текущего времени, уровень непредсказуемости или энтропии будет довольно низким. Это происходит потому, что вариации времени между запусками незначительны. С другой стороны, crypto/rand предлагает лучшее решение для генерации чисел, которые криптографически безопасны. Эта библиотека разработана для полной непредсказуемости, используя источники случайности, предоставляемые ОС, которые обычно гораздо сложнее предсказать. import "crypto/rand" func Key() string { buf := make([]byte, 16) _, err := rand.Read(buf) if err != nil { panic(err) } return fmt.Sprintf("%x", buf) } Использование crypto/rand особенно необходимо для операций, таких как шифрование, аутентификация или любой другой контекст, где безопасность имеет критическое значение. Опять же, если мы генерируем ключи для целей, не связанных с безопасностью, math/rand вполне подойдет.
1 07412Loading...
03
💬 Интерфейс и any (interface{}) в Go — это одно и то же? Объясните простыми словами. Нет, это не одно и то же. Интерфейсы определяют контракты для типов, которые их реализуют. any — это псевдоним для пустого интерфейса interface{}. Пустой интерфейс interface{} может содержать значение любого типа, поскольку он не требует реализации никаких методов.
1 18511Loading...
04
💬 Интерфейс и any (interface{}) в Go — это одно и то же? Объясните простыми словами. Нет, это не одно и то же. Интерфейсы определяют контракты для типов, которые их реализуют. any — это псевдоним для пустого интерфейса— это одно и то который называется(interf Пустой интерфейсy (interface{})может содержать значение любого типа, поскольку он не требует реализации никаких методов.
10Loading...
05
⚡️Proglib запускает канал про ИИ для генерации звука Там мы будем рассказывать про все существующие нейросети, которые генерируют музыку и голос — с пошаговыми инструкциями, инструментами и лайфхаками. ⭐️генерация голоса и музыки ⭐️замена и перевод речи ⭐️распознавание звуков 👉Подписывайтесь!
1 2552Loading...
06
💬 Почему pointer ресивер предпочтительнее использовать, чем value ресивер в Go? Первая причина — чтобы метод мог изменить значение, на которое указывает его ресивер. Вторая — чтобы избежать копирования значения при каждом вызове метода. Это может быть более эффективно, если ресивер, например, является большой структурой. В примере ниже, оба метода Scale и Abs имеют тип ресивер *Vertex, хотя метод Abs не должен изменять свой ресивер. package main import ( "fmt" "math" ) type Vertex struct { X, Y float64 } func (v *Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func main() { v := &Vertex{3, 4} fmt.Printf("Before scaling: %+v, Abs: %v\n", v, v.Abs()) v.Scale(5) fmt.Printf("After scaling: %+v, Abs: %v\n", v, v.Abs()) } В общем случае, все методы для данного типа должны использовать либо только pointer ресивер, либо только value ресивер, чтобы избежать путаницы и обеспечить согласованность.
1 40016Loading...
07
💬 Поддерживается ли в Go арифметика указателей как C++ или других языках? В Go, в отличие от других языков, таких как C++, арифметика указателей не поддерживается напрямую. К примеру, нельзя прибавить или вычесть числа непосредственно у указателя, перемещая его вдоль блока памяти. Отсутствие арифметики указателей исключает целый класс ошибок, связанных с выходом за границы массива, неправильным обращением к памяти и другими подобными проблемами. Это помогает предотвратить баги и уязвимости, связанные с прямым доступом и изменением адресов памяти. Для выполнения операций, аналогичных арифметике указателей, в Go можно использовать слайсы, которые обеспечивают безопасный доступ к элементам массива и автоматически управляют размером и ёмкостью.
1 5109Loading...
08
Ответьте на 3 вопроса, чтобы получить вводные занятия к курсу «Алгоритмы и структуры данных» 🔥Получите вводные занятия, ответив на 3 вопроса – https://proglib.io/w/c2161ff4 На вводной части вас ждут: 1. Лекция «Производительность алгоритмов» от руководителя разработки Яндекс.Самокатов 2. Лекция «Итеративные сортировки и линейные сортировки» от аспирант департамента искусственного интеллекта ВШЭ 3. Практические задания после лекций 4. Ссылки на дополнительные материалы для самостоятельного изучения ⚡️Переходите и начинайте учиться уже сегодня – https://proglib.io/w/c2161ff4
1 3473Loading...
09
💬 Что произойдет, если в type switch использовать временную переменную для типа nil? Какой тип будет у этой переменной? Когда в type switch используется временная переменная для типа nil, тип этой переменной будет таким же, как и тип исходного значения, которое мы проверяем в TypeSwitchGuard. Например, если исходное значение имеет тип any, временная переменная также будет иметь тип any. Это можно проиллюстрировать следующим примером: var x any var y error switch t := x.(type) { case nil: y = t // Ошибка компиляции: any does not implement error } В этом примере код не компилируется с ошибкой, указывающей, что переменная типа any не может быть присвоена переменной типа error, так как тип any не реализует метод Error. Это подтверждает, что временная переменная t в случае nil имеет тот же тип, что и x (в данном случае any).
1 47610Loading...
10
💬 Почему в Go лучше использовать strconv вместо fmt для преобразования в/из строки? Пакет strconv специально создан для преобразования строк, что означает, что он оптимизирован именно для них. Для наглядности рассмотрим простое сравнение производительности: func BenchmarkFmt(b *testing.B) { for i := 0; i < b.N; i++ { _ = fmt.Sprint(i) } } func BenchmarkStrconv(b *testing.B) { for i := 0; i < b.N; i++ { _ = strconv.Itoa(i) } } BenchmarkFmt-8 23821753 50.17 ns/op 16 B/op 2 allocs/op BenchmarkStrconv-8 100000000 11.47 ns/op 3 B/op 1 allocs/op strconv.Itoa значительно быстрее и эффективнее с точки зрения выделения памяти по сравнению с fmt.Sprint. fmt.Sprint при этом использует рефлексию, чтобы понять, с каким типом данных работает, и определяет лучший способ форматирования его как строки. Процесс рефлексии не «бесплатный», он добавляет как время, так и накладные расходы на память, что может быть довольно значительным, когда мы обрабатываем большие объемы данных или требуется высокая производительность.
1 53224Loading...
11
💬 Почему лучше использовать неэкспортируемую пустую структуру в качестве ключа контекста в Go вместо строки или другого примитивного типа? Использование неэкспортируемой пустой структуры в качестве ключа контекста в Go предпочтительнее по нескольким причинам: 1. Уникальность: пустая структура обеспечивает уникальность в пределах области видимости пакета, что помогает избежать конфликтов, которые могут возникнуть при использовании строк или других примитивных типов в качестве ключей. 2. Легковесность: пустая структура не выделяет памяти, так как она не содержит полей, что делает ее очень легким и эффективным вариантом для использования в качестве ключа. 3. Избежание конфликтов: использование пустых структур помогает избежать конфликтов с другими пакетами, которые могут случайно использовать те же самые строки или примитивные типы в качестве ключей контекста. Пример кода с использованием пустой структуры: type contextKey struct{} func main() { ctx := context.WithValue( context.Background(), contextKey{}, "данные, связанные с запросом", ) handleRequest(ctx) } func handleRequest(ctx context.Context) { fmt.Println("data:", ctx.Value(contextKey{})) } Этот пример демонстрирует, как использование пустой структуры в качестве ключа контекста помогает обеспечить уникальность и избежать потенциальных конфликтов.
1 52031Loading...
12
💬 Как отключить поддержку HTTP/2 на стороне клиента и сервера в Go? Почему это может понадобиться? Можно использовать переменную окружения GODEBUG. Она позволяет управлять выполнением определенных частей программы Go. Для отключения HTTP/2 необходимо установить GODEBUG следующим образом: export GODEBUG=http2client=0,http2server=0 Эта команда отключит поддержку HTTP/2 по умолчанию как в HTTP-клиенте, так и в HTTP-сервере. Это может быть полезно в случае, если есть проблемы с реализацией HTTP/2 на сервере или если необходимо поддерживать совместимость с более старыми системами, которые не поддерживают HTTP/2. При запуске программы Go с такими параметрами GODEBUG, программа будет использовать только HTTP/1.1 для всех HTTP-запросов и ответов, обходя любые потенциальные проблемы, связанные с HTTP/2. 👉 Подробнее
1 55318Loading...
13
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом. Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций. Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах. 👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
1 6264Loading...
14
💬 Почему важно следить за временем жизни горутин и как мы можем избежать проблем с утечкой памяти в Go? Потому что каждая горутина занимает определенное количество памяти для своего стека. Если горутина продолжает работать бесконечно или не завершается корректно, это может привести к утечке памяти и повышенному использованию ресурсов. 📌 Чтобы избежать проблем с утечкой памяти, необходимо: 1. Использовать контексты (context.Context): контексты позволяют контролировать время выполнения горутины и отменять её выполнение, когда это необходимо. Например, использование select с контекстом позволяет горутине завершиться корректно при получении сигнала отмены: func Job(ctx context.Context, d time.Duration) { for { select { case <-ctx.Done(): return default: ... time.Sleep(d) } } } 2. Закрывать каналы: если горутина читает данные из канала, важно корректно закрывать этот канал, чтобы горутина завершалась и не зависала бесконечно. func worker(jobs <-chan int) { for i := range jobs { ... } } jobs := make(chan int) go worker(jobs) // Закрытие канала, когда работа завершена close(jobs) 3. Избегать использования time.Sleep() без контекста: функция time.Sleep() не поддерживает прерывания и может привести к зависанию горутины, если её необходимо завершить. Вместо этого используйте конструкции, учитывающие контекст, такие как time.After с select.
1 59032Loading...
15
✉️❌ Как завалить собеседование, даже не начав его: 8 ошибок в сопроводительных письмах Откликаетесь, но сразу получаете отказы? Не торопитесь с выводами — возможно, все дело в вашем сопроводительном письме. 👉Сопроводительное — это первое впечатление, которое мы производим на эйчара, а первое впечатление, как известно, очень важно. Собрали для вас несколько распространенных ошибок по составлению такого письма — а в статье по ссылке можно найти остальные ошибки и пример идеального сопроводительного. Кстати, вакансии можно поискать в наших профильных каналах: 🤮Data Science, анализ данных, аналитика 🤮Python 🤮Frontend
1 89215Loading...
16
💬 Почему использование time.Sleep() может быть проблематичным в Go-программах, и как можно улучшить управление паузами, чтобы учитывать контекст выполнения? Использование time.Sleep() может быть проблематичным, потому что оно не учитывает контекст выполнения и не может быть прервано. Например, если приложение получает сигнал на завершение работы, функция, использующая time.Sleep(), не сможет сразу прекратить выполнение, а продолжит выполнение только после завершения периода сна. Это может привести к задержкам в завершении работы приложения и другим проблемам. Чтобы улучшить управление паузами и учитывать контекст выполнения, лучше использовать конструкции, которые могут реагировать на сигналы контекста. Например, можно использовать функцию time.After() в сочетании с select, чтобы обрабатывать паузы и проверку контекста: func doWork(ctx context.Context, d time.Duration) { for { select { case <-ctx.Done(): return case <-time.After(d): } ... } } Также можно использовать time.Timer для более эффективного управления таймерами: func doWork(ctx context.Context, d time.Duration) { delay := time.NewTimer(d) for { select { case <-ctx.Done(): if !delay.Stop() { <-delay.C } return case <-delay.C: _ = delay.Reset(d) } ... } } Этот подход позволяет функции немедленно завершиться при получении сигнала завершения контекста, предотвращая утечки памяти и обеспечивая более предсказуемое поведение программы.
1 57430Loading...
17
💬 Как использовать context.AfterFunc для выполнения функции после отмены контекста и что происходит, если контекст уже отменен? В Go функция context.AfterFunc (Go 1.21 +) позволяет запланировать выполнение функции после завершения контекста, будь то из-за отмены или тайм-аута. Она запускает функцию в новой горутине сразу после того, как канал ctx.Done родительского контекста отправляет сигнал. 📌 Пример использования: ctx, cancel := context.WithTimeout(parentCtx, 5*time.Second) defer cancel() stop := context.AfterFunc(ctx, func() { fmt.Println("Cleanup operations after context is done") }) Если контекст уже отменен на момент вызова AfterFunc, функция f будет выполнена немедленно в новой горутине. Функция stop() позволяет отменить запланированную функцию, если она еще не начала выполняться. Если stop() возвращает true, это означает, что функция была успешно остановлена до выполнения. Если stop() возвращает false, это означает, что функция уже начала выполняться или была остановлена ранее. 📌 Пример использования stop(): stop := context.AfterFunc(ctx, func() { // some cleanup code }) if stopped := stop(); stopped { fmt.Println("Remove the callback before context is done") } Функция AfterFunc полезна для выполнения задач очистки, логирования или других операций, которые необходимо выполнить после отмены контекста.
1 64432Loading...
18
💬 Как можно оптимизировать многократные вызовы одной и той же функции в Go, чтобы избежать выполнения одной и той же работы несколько раз? Можно использовать пакет singleflight. Он гарантирует, что независимо от того, сколько раз вызывается функция в один и тот же период, она будет выполнена только один раз, и результат этого вызова будет возвращен всем вызывающим. 📌 Пример использования: var group singleflight.Group func UsingSingleFlight(key string) { v, _, _ := group.Do(key, func() (any, error) { return FetchExpensiveData() }) fmt.Println(v) } В этом примере singleflight.Group оборачивает вызов функции внутри метода group.Do(), который проверяет, был ли тот же ключ уже запрошен. Если да, он ждет результата первоначального вызова и возвращает его всем вызывающим. Основное преимущество использования singleflight заключается в том, что он предотвращает многократное выполнение одной и той же работы, что особенно полезно для ресурсоемких операций или операций, которые нельзя выполнять одновременно (например, ping() на сервер). В отличие от кеша, singleflight не сохраняет результаты, а просто координирует выполнение функции.
1 68226Loading...
19
💬 Почему использование chan struct{} вместо chan bool предпочтительнее для сигнализации между горутинами? 🔹 chan struct{} сразу показывает, что канал используется исключительно для сигнализации, тогда как chan bool может вызвать путаницу, так как значения true и false могут иметь разный смысл. 🔹 Тип struct{} не занимает памяти — это просто сигнал. Это приводит к небольшой, но все равно оптимизации памяти. 🔹 chan struct{} исключает возможность неправильного использования канала для передачи данных, что может произойти при использовании chan bool. 🔹 Для одноразового сигнала можно просто закрыть канал, что является понятным и эффективным способом передать сигнал нескольким получателям без отправки данных. 📌 Пример: type JobDispatcher struct { start chan struct{} } func NewJobDispatcher() *JobDispatcher { return &JobDispatcher{ start: make(chan struct{}), } } func (j *JobDispatcher) Start() { close(j.start) }
1 76322Loading...
20
👩‍💻 errors.Is(), errors.As(), errors.Unwrap(), кастомные ошибки и многое другое: подробное руководство для Go-разработчика 👉 Читать
1 11923Loading...
21
Самые полезные каналы для программистов в одной подборке! Сохраняйте себе, чтобы не потерять 💾 🔥Для всех Библиотека программиста — новости, статьи, досуг, фундаментальные темы Книги для программистов IT-мемы Proglib Academy — тут мы рассказываем про обучение и курсы 🤖Про нейросети Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка Библиотека нейротекста | ChatGPT, Gemini, Bing Библиотека нейровидео | Sora AI, Runway ML, дипфейки Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion #️⃣C# Книги для шарпистов | C#, .NET, F# Библиотека шарписта — полезные статьи, новости и обучающие материалы по C# Библиотека задач по C# — код, квизы и тесты Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel ☁️DevOps Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps Вакансии по DevOps & SRE Библиотека задач по DevOps — код, квизы и тесты Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования 🐘PHP Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP Вакансии по PHP, Symfony, Laravel Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по PHP — код, квизы и тесты 🐍Python Библиотека питониста — полезные статьи, новости и обучающие материалы по Python Вакансии по питону, Django, Flask Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по Python — код, квизы и тесты ☕Java Книги для джавистов | Java Библиотека джависта — полезные статьи по Java, новости и обучающие материалы Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по Java — код, квизы и тесты Вакансии для java-разработчиков 👾Data Science Книги для дата сайентистов | Data Science Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по Data Science — код, квизы и тесты Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту 🦫Go Книги для Go разработчиков Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по Go — код, квизы и тесты Вакансии по Go 🧠C++ Книги для C/C++ разработчиков Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++ Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по C++ — код, квизы и тесты Вакансии по C++ 💻Другие каналы Библиотека фронтендера Библиотека мобильного разработчика Библиотека хакера Библиотека тестировщика Вакансии по фронтенду, джаваскрипт, React, Angular, Vue Вакансии для мобильных разработчиков Вакансии по QA тестированию InfoSec Jobs — вакансии по информационной безопасности 📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈 Также у нас есть боты: Бот с IT-вакансиями Бот с мероприятиями в сфере IT Мы в других соцсетях: 🔸VK 🔸YouTube 🔸Дзен 🔸Facebook * 🔸Instagram * * Организация Meta запрещена на территории РФ
1 6956Loading...
22
💬 Почему следует избегать использования context.Background() напрямую? Какие есть альтернативы? Использование context.Background() напрямую не рекомендуется, потому что он не предоставляет способа остановить или отменить операции, если что-то пойдет не так. Этот контекст самый простой, без значений, сроков и сигналов отмены. Это может стать проблемой, когда задачи застревают или требуют плавного завершения. Чтобы справиться с этим, лучше использовать context.WithTimeout, context.WithCancel или context.WithDeadline. Эти контексты позволяют задавать время ожидания или возможность отмены, что делает горутины более управляемыми и надежными. 📌 Вот примеры использования: 🔸 context.WithTimeout(ctx, duration): задает время ожидания для выполнения задачи. 🔸 context.WithCancel(ctx): позволяет отменить задачу вручную. 🔸 context.WithDeadline(ctx, deadline): устанавливает конкретное время завершения задачи. Можно также использовать функции с суффиксом Cause (например, context.WithTimeoutCause), которые дают более детальные сообщения об ошибках (например, "context deadline exceeded: custom message"). В случае работы с каналами, чтобы не ждать ответа бесконечно, можно использовать конструкцию select с тайм-аутом: select { case result := <-ch: fmt.Println("Received result:", result) case <-time.After(5 * time.Second): fmt.Println("Timed out") } Однако, time.After может привести к краткосрочным утечкам памяти. В таких случаях лучше использовать time.Timer или time.Ticker для лучшего контроля над временем.
1 73218Loading...
23
Можно также использовать функции с суффиксом Cause (например, `context.WithTimeoutCause`), которые дают более детальные сообщения об ошибках (например, "context deadline exceeded: custom message"). В случае работы с каналами, чтобы не ждать ответа бесконечно, можно использовать конструкцию select с тайм-аутом: select { case result := <-ch: fmt.Println("Received result:", result) case <-time.After(5 * time.Second): fmt.Println("Timed out") } Однако, time.After может привести к краткосрочным утечкам памяти. В таких случаях лучше использовать time.Timer или time.Ticker для лучшего контроля над временем.
10Loading...
24
#tips 🎙«Как мы перешли на Microsoft.Extensions.Configuration и стало хорошо» — доклад Андрея Рягузова про то, как компания перешла от самописного метода работы с настройками к стандартному варианту, предлагаемому Microsoft. Вы узнаете, почему они использовали нестандартный метод изначально, какие выгоды и новые возможности открываются при использовании «коробочных» инструментов и как можно интегрировать их в свои проекты. ▶️ Смотреть YouTube Андрей Рягузов «Как мы перешли на Microsoft.Extensions.Configuration и стало хорошо» Андрей расскажет о том, как компания перешла от самописного метода работы с настройками к стандартному варианту, предлагаемому Microsoft. Почему они использо... Поросёнок Пётр Рад представить наш новый выпуск с новым гостем из мира Security. Со времен когда bug bounty было не таким "модным", наш гость умудрился запустить сайтик и в режиме реального времени насобирать на Porsche 911. Сейчас этим сложно удивить, но 10 лет назад это казалось невероятным. Это не единственное о чем мы поговорили с Кириллом. Приятного просмотра 😉 https://youtu.be/QMXBCpomYyM YouTube Кир (isox) Ермаков - Porsche на BugBounty, CEO Vulners, роль CIO для High-risk Businesses (Ep.3) Гость нашего подкаста занимается компьютерной безопасностью уже более 15 лет. Свой путь в индустрии он начал с системного администратора, немного поохотился ... Какие протоколы и форматы данных поддерживаются для сетевой коммуникации в Go? Go поддерживает множество протоколов и форматов данных для сетевой коммуникации. Вот список наиболее часто используемых протоколов и форматов данных, которые можно использовать в сетевых приложениях на Go: Протоколы: HTTP/HTTPS: Протокол передачи гипертекста (HTTP) и его защищённая версия HTTPS широко используются для обмена данными между клиентами и серверами в Интернете. Go включает стандартный пакет net/http для создания HTTP-серверов и клиентов. TCP: Протокол управления передачей (TCP) обеспечивает надежное и установленное соединение для обмена данными. В Go есть встроенная поддержка TCP в стандартной библиотеке. UDP: Протокол пользовательских дейтаграмм (UDP) предлагает более легкое и ненадежное соединение для обмена данными. Go также поддерживает UDP. WebSocket: WebSocket - это протокол, который обеспечивает двунаправленную коммуникацию через одно TCP-соединение, поддерживая более интерактивную связь. В Go есть пакеты для работы с WebSocket. gRPC: gRPC - это высокопроизводительный фреймворк для удаленного вызова процедур (RPC), использующий HTTP/2 для передачи данных. Часто используется для построения микросервисов. Go предоставляет библиотеку gRPC. Форматы данных:
10Loading...
25
JSON: JavaScript Object Notation (JSON) - читаемый и широко используемый формат обмена данными. Go включает пакеты encoding/json и encoding/json для кодирования и декодирования JSON. XML: Extensible Markup Language (XML) - формат для структурированных данных. Go имеет пакеты для работы с XML, такие как encoding/xml. Protocol Buffers (protobuf): Protocol Buffers - это бинарный формат сериализации данных, обеспечивающий высокую производительность и компактность. Go поддерживает protobuf через библиотеку github.com/golang/protobuf/proto. MessagePack: MessagePack - это бинарный формат обмена данными, также предлагающий компактность и производительность. Go имеет библиотеки для работы с MessagePack, такие как github.com/vmihailenco/msgpack и github.com/tinylib/msgp. Toml: TOML (Tom’s Obvious, Minimal Language) - формат конфигурационных файлов, который можно использовать для обмена данными. Go имеет библиотеки для работы с TOML, например, github.com/BurntSushi/toml. CSV: Значения, разделенные запятыми (CSV) - это формат данных, часто используемый для обмена табличными данными. Go включает стандартные пакеты для чтения и записи CSV-файлов. YAML: YAML (YAML Ain’t Markup Language) - формат для структурированных данных, часто используемый для конфигурационных файлов. Go поддерживает YAML через пакеты, такие как gopkg.in/yaml.v2. Это лишь несколько примеров протоколов и форматов данных, которые можно использовать в Go для сетевого обмена информацией. Выбор конкретных протоколов и форматов зависит от требований вашего приложения и случаев использования. conf wg0-client-anastasia.conf 0.3 KB 💬 Почему следует избегать использования context.Background() напрямую? Использование context.Background() напрямую не рекомендуется, потому что он не предоставляет способа остановить или отменить операции, если что-то пойдет не так. Этот контекст самый простой, без значений, сроков и сигналов отмены. Это может стать проблемой, когда задачи застревают или требуют плавного завершения. Чтобы справиться с этим, лучше использовать context.WithTimeout, context.WithCancel или context.WithDeadline. Эти контексты позволяют задавать время ожидания или возможность отмены, что делает горутины более управляемыми и надежными. 📌 Вот примеры использования: 🔸 context.WithTimeout(ctx, duration): задает время ожидания для выполнения задачи. 🔸 context.WithCancel(ctx): позволяет отменить задачу вручную. 🔸 context.WithDeadline(ctx, deadline): устанавливает конкретное время завершения задачи. Можно также использовать функции с суффиксом Cause (например, `context.WithTimeoutCause`), которые дают более детальные сообщения об ошибках (например, "context deadline exceeded: custom message"). В случае работы с каналами, чтобы не ждать ответа бесконечно, можно использовать конструкцию select с тайм-аутом: select { case result := <-ch: fmt.Println("Received result:", result) case <-time.After(5 * time.Second): fmt.Println("Timed out") } Однако, time.After может привести к краткосрочным утечкам памяти. В таких случаях лучше использовать time.Timer или time.Ticker для лучшего контроля над временем. 💬 Почему следует избегать использования context.Background() напрямую? Использование context.Background() напрямую не рекомендуется, потому что он не предоставляет способа остановить или отменить операции, если что-то пойдет не так. Этот контекст самый простой, без значений, сроков и сигналов отмены. Это может стать проблемой, когда задачи застревают или требуют плавного завершения. Чтобы справиться с этим, лучше использовать context.WithTimeout, context.WithCancel или context.WithDeadline. Эти контексты позволяют задавать время ожидания или возможность отмены, что делает горутины более управляемыми и надежными. 📌 Вот примеры использования: 🔸 context.WithTimeout(ctx, duration): задает время ожидания для выполнения задачи. 🔸 context.WithCancel(ctx): позволяет отменить задачу вручную. 🔸 context.WithDeadline(ctx, deadline): устанавливает конкретное время завершения задачи.
10Loading...
26
Structure of URL #web 🤔 Как вам рубрика «советы по работе #vim»? Нет, только не говорите, что не любите этот редактор 🥷 👩‍💻.Используйте команду :%norm для использования режима normal в каждой строке файла👇 ☑️ Например, предположим, что у нас есть список слов. Мы хотим, чтобы эти слова стали ключами в JSON-файле с пустыми значениями. :%norm csw"A: "", 🔗 Подробнее Vimtricks Operate on every line - VimTricks Use Vim's :norm command to operate on every line in a file. Размер макетов: подробное руководство по CSS fr Unit Основные преимущества использования fr: ➡️ единицы fr отзывчивы по своей природе. По мере изменения размера контейнера изменяются и дроби, сохраняя пропорции макета. ➡️ Они полезны для создания гибкого дизайна на основе grid без необходимости указания фиксированной ширины в пикселях. 🧮 Разработка и использование парсера .NET AsciiMath в расширении Markdig Эндрю Лок изучил несколько существующих решений, позволяющих конвертировать в MathML и отображать математические формулы, но ничего лучше портирования реализации Ruby AsciiDoctor на .NET не нашел. Читайте подробнее о реализации и том, как автор использовал ChatGPT для упрощения рутинных задач. Andrew Lock | .NET Escapades Creating a .NET AsciiMath parser and using it in a Markdig extension In this post I describe how I ported a Ruby AsciiMath implementation to .NET, created the AsciiMath NuGet package, and used it to create a Markdig extension Разрабы #рекомендации из выпуска с Анной Блок 👉 Анна Блок | FrontendBlok — телеграм-канал Анны Блок про фронтенд, вёрстку, удалёнку. 👉 Анна Блок — ютуб-канал Анны Блок. 👉 Новинки CSS — плейлист на Youtube, где Анна Блок рассказывает о новых свойствах и правилах CSS. 👉 Создание сайтов на практике — плейлист на Youtube с практикой создания сайтов с нуля. 👉 WebDX Community Group — страница сообщества, миссия которой является улучшения в подходах к веб-разработке. 👉 Записи встреч — на этом сайте есть возможность отслеживать, какие нововведения обсуждаются и потенциально могу появиться в веб-разработке. 👉 Baseline — тут можно узнать подробнее про стандарты поддержки браузерами новых и не очень свойств CSS. ____ Невышедший эпизод шоу "Тен за бугром" уже доступен на наших спонсорских площадках Подписывайтесь! https://sponsr.ru/myobrecheny https://boosty.to/myobrecheny https://patreon.com/myobrecheny 💬Go вы можете отформатировать строку без её вывода? С использованием функции fmt.Sprintf. Она работает аналогично fmt.Printf, но вместо вывода результата в стандартный вывод, она возвращает отформатированную строку. Мы можем использовать fmt.Sprintf для создания строк с переменными или сложными форматами, которые затем могут быть использованы в коде или сохранены для последующего использования. https://dev.to/karenpayneoregon DEV Community Karen Payne — DEV Community Profile Microsoft MVP, Microsoft TechNet author, Code magazine author, developer advocate. Have a passion for driving race cars. Н Method value (сам не знал сей термин 🙂 Значение метода. Спека: Method values If the expression x has static type T and M is in the method set of type T, x.M is called a method value. The method value x.M is a function value that is callable with the same arguments as a method call of x.M. The expression x is evaluated and saved during the evaluation of the method value; the saved copy is then used as the receiver in any calls, which may be executed later. type S struct { *T } type T int func (t T) M() { print(t) } t := new(T) s := S{T: t} f := t.M // receiver *t is evaluated and stored in f g := s.M // receiver *(s.T) is evaluated and stored in g *t = 42 // does not affect stored receivers in f and g Young Researchers Reward Program ⚡️Конкурс!⚡️ Наши друзья из Positive Technologies предоставили нам 6 проходок на PhD для проведения благотворительного конкурса. Читаем инфу ниже!
10Loading...
27
📎 Описание конкурса: Вы пишете обезличенный отчет, в котором рассказываете о своей самой интересной баге, отправляете отчет в бота. Позже команда жюри оценит его, а уже 17 мая мы свяжемся с участниками и отдадим их заслуженные призы). 🏅 Призы: Жюри выберет топ 6 участников для полноценной или частичной компенсации билетов на PositiveHackDays и обратно! 🔖 Как мне участвовать? 1. Являться школьником/студентом бакалавриата или специалитета 2. Отправить файл формата .docx или .pdf с описанием бага в нашего бота (В описании к файлу должно содежаться слово Заявка) ⏰ Время проведения: 6го мая в 15:00 - Старт приема заявок 13 мая 15:00 - Закрытие приема заявок 17 мая 17:00 Оглашение результатов 📝 Критерии оценивания: 1. Подробность описания (3 балла) 2. Сложность эксплуатации (2 балла) 3. Нестандартный подход и креативность (3 балла) 4. Вау-эффект (субъективный параметр на усмотрение членов жюри) (2 балла) 👀 Состав жюри: @SidneyJob (Пентестер, автор канала Заметочки SidneyJob) @curiv (Пентестер, активист ИБ сообщества, основатель @dc7342, @permctf, автор канала @pathsecure) @cyrus_0x00 (Пентестер в компании DeteAct ✨) @brotherok (Багхантер, автора канала ШКИБыть) @bughunter_circuit (Автор канала о багхантинге) @romanpnn (Автор канала Пакет Безопасности) @wr3dmast3r (Пентестер, автор канала wr3dmast3r vs pentest) <конечный список жюри уточняется> 💰Бюджет: Бюджет на оплату дороги для всех участников - 120 тысяч. Мы тратим весь планируемый бюджет, в том числе, в счет компенсации оплаты дороги другим победителям. 📃 Что будет с отчетами? Планируется опубликовать отчеты победителей (при согласии автора) 👉 Важная деталь: Жюри и бюджет формируется независимыми инициативными участниками русскоязычного ИБ сообщества. Конкурс следует воспринимать как благотворительность в отношении перспективных молодых талантов. Мы убеждены, что за такими специалистами находится будущее ИБ сообщества. 💬 По всем вопросам писать сюда: @SidneyJob, @CuriV Telegram Positive Technologies Официальный канал Positive Technologies. Уже более 20 лет наша основная задача — предотвращать хакерские атаки до того, как они причинят неприемлемый ущерб бизнесу и цел... VIEW CHANNEL 🚀 Поехали! Последняя пятница недели, друзья! 🏢 ЯИБАШНИ 🏢 - наконец-таки твой блестящий код попадет куда-то ещё, помимо калькулятора, на котором ты его печатал. Теперь не только твоя соседка, узнает какой ты дурачок. Скрести пальцы! Яндекс музыка пытается рассчитать мои рекомендации исходя из того что в течении дня я могу послушать Ирину Аллерову, АС/DC и фонк ремиксы песен из «Смешариков» Bounty On Coffee Исчерпывающий материал по Client-Side. https://aszx87410.github.io/beyond-xss/en/ aszx87410.github.io About This Series | Beyond XSS As a software engineer, you must be familiar with information security. In your work projects, you may have gone through security audits, including static code scanning, ... https://youtu.be/mXW7JHJM34k https://youtu.be/mXW7JHJM34k?si=xRFFxqYtWgDjQerO YouTube Intuitive SQL For Data Analytics - Tutorial Learn SQL for analytics. Learn both the theory and the practice so you can confidently solve hard SQL challenges on your own. No previous experience required... 🧰 GoWrap — CLI-инструмент, который генерирует декораторы для интерфейса Go с использованием простых шаблонов. Внутри множество шаблонов для простого добавления метрик, трассировки, пулов и многих других фич в существующий код. 👩‍💻 GitHub GitHub GitHub - hexdigest/gowrap: GoWrap is a command line tool for generating decorators for Go interfaces GoWrap is a command line tool for generating decorators for Go interfaces - hexdigest/gowrap «REST API клиенты для C#» https://youtu.be/UNqQ5BGN7Og?si=2ViTu3gfrACrrs08 YouTube Артём Квашнин «REST API клиенты для C#» В докладе мы рассмотрим типичные ошибки при работе со стандартным HttpClient, посмотрим на реализацию межсервисного взаимодействия от Microsoft и самое главн... Потерялись в скобках? #vim может выделить другую сторону вашей текущей скобки с помощью :set showmatch.
10Loading...
28
Открытое собеседование на Gо-разработчика 16 мая в 19:00 по мск приходи онлайн на Открытое собеседование от Эйч Навыков. Как это будет: 1. Александр Трапезников, Тимлид в Яндекс Беспилотниках и ментор Эйч Навыков будет задавать реальные вопросы и задачи кандидату. 2. Потом Саша даст подробную обратную связь — объяснит, зачем задавал тот или иной вопрос, как лучше на него ответить или решить задачу 3. В конце можно будет задать любой вопрос Саша Что узнаешь на Открытом собеседовании: - Чего ждут от кандидатов на мидл-позиции в Gо-разработке - Какие вопросы задают на интервью и зачем - Как подготовиться к собесу, чтобы получить заветный оффер Это бесплатно? Бесплатно Просто зарегистрируйся на открытое собеседование в нашем боте @skills_mentee_bot Реклама: ООО “Эйч Карьера” erid: LjN8KKWRr
1 0486Loading...
29
💬 В чем преимущество использования iota в Go? iota — это предопределенное значение, которое можно использовать в объявлении const для создания последовательности связанных значений. Использование приема с iota избавляет от необходимости вручную присваивать значения константам. Вместо этого можно записать такое определение: type EventType byte const ( _ = iota // iota == 0; игнорировать нулевое значение EventDelete EventType = iota // iota == 1 EventPut // iota == 2; неявное присваивание ) В объявлении константы iota представляет последовательно увеличивающиеся нетипизированные целочисленные значения, которые можно использовать для создания набора связанных констант. В начале каждого объявления const идентификатор iota получает нулевое значение и затем увеличивается с каждой операцией присваивания значения новой константе (независимо от использования ссылки на идентификатор iota). Поскольку iota является нетипизированным числом, его можно использовать для присваивания типизированных значений без явного приведения типов, даже кон- станте с типом float64: const ( u = iota * 42 // iota == 0; u == 0 (нетипизированная целочисленная константа) v float64 = iota * 42 // iota == 1; v == 42.0 (константа типа float64) ) Ключевое слово iota допускает неявное перечисление, что делает тривиальным создание произвольно длинных наборов связанных констант, как это показано в следующем примере, где перечисляются различные единицы измерения размеров в байтах: type ByteSize uint64 const ( _ = iota KB ByteSize = 1 << (10 * iota) MB GB TB PB )
2 01030Loading...
30
💬 Что такое идемпотентность? Идея идемпотентности (тождественности влияния) зародилась в алгебре, где описывает определенные свойства некоторых математических операций. В мире программирования операция считается идемпотентной, если ее однократное выполнение имеет тот же эффект, что и многократное. Например, операция присваивания x = 1 идемпотентна, потому что после ее выполнения x всегда будет хранить 1, независимо от того, сколько раз ее выполнить. Точно так же HTTP-метод PUT является идемпотентным, поскольку многократная отправка ресурса в какое-либо место ничего не изменит: повторная отправка не даст ничего нового. Операция x += 1, однако, не является идемпотентной, потому что после каждого ее выполнения создается новое состояние.
1 94824Loading...
31
💬 Чем отличаются сигналы Linux? Какие можно перехватить? Сигналы в Linux представляют собой ограниченную форму межпроцессного взаимодействия, используемую для отправки уведомлений процессу о различных событиях. Они часто используются для уведомления процесса о необходимости завершения работы или информирования о возникновении какой-либо ошибки. 📌 Основные различия: 1. Синхронные сигналы — вызываются ошибками в программе (например, деление на ноль). Эти сигналы отправляются напрямую процессу, выполняющему ошибочное действие. 2. Асинхронные сигналы — посылаются внешними процессами или системой. Например, SIGKILL или SIGTERM, отправляемые для завершения процесса. 📌 Перехватываемые и неперехватываемые сигналы: 🔹 Перехватываемые сигналы могут быть обработаны программой. Программа может определить функцию-обработчик для таких сигналов, изменяя стандартное поведение. Например, SIGTERM и SIGUSR1 можно перехватить и обработать, выполнив определённые действия перед завершением программы или инициированием других процедур. 🔹 Неперехватываемые сигналы нельзя перехватить или проигнорировать. Эти сигналы немедленно выполняют своё стандартное действие. Примером неперехватываемого сигнала является SIGKILL, который всегда немедленно завершает процесс. 📌 Примеры перехватываемых сигналов: 🔹 SIGTERM — просит процесс завершиться. Это корректный способ попросить программу завершить свою работу. 🔹 SIGHUP — уведомляет процесс о потере управляющего терминала. Часто используется для перезагрузки конфигураций сервисов. 🔹 SIGUSR1, SIGUSR2 — резервируются для использования в пользовательских приложениях. 📌 Примеры неперехватываемых сигналов: 🔹 SIGKILL — немедленно завершает процесс. Не может быть перехвачен или обработан. 🔹 SIGSTOP — останавливает (приостанавливает) процесс до получения сигнала SIGCONT.
1 98031Loading...
32
💬 Что из себя представляет механизм method value и чем он полезен? Method value — механизм, который позволяет ссылаться на метод объекта с привязкой к конкретному экземпляру этого объекта. Это значит, что мы можем сохранить ссылку на метод определённого экземпляра и использовать эту ссылку для вызова метода позже, при этом метод автоматически будет вызываться для связанного с ним экземпляра. 📌 Как это работает: когда мы берём метод от экземпляра структуры или типа, Go автоматически создаёт функцию, которая "замыкает" этот экземпляр внутри себя. Эта функция при вызове будет применять метод к тому экземпляру, для которого она была создана. 📌 Пример: type Counter struct { value int } func (c *Counter) Increment() { c.value++ } func main() { c := &Counter{value: 10} increment := c.Increment // Сохраняем method value increment() // Вызываем метод через сохранённую ссылку fmt.Println(c.value) // Выведет 11 } В примере increment является method value, которое привязано к конкретному экземпляру c. Вызов increment() эквивалентен вызову c.Increment(). Method value особенно полезны в ситуациях, когда необходимо передать метод как аргумент функции или сохранить метод для последующего вызова. Это позволяет использовать методы объектов так, как если бы они были обычными функциями, при этом сохраняя контекст вызова внутри метода.
1 90418Loading...
33
💬 Допустимо ли возвращать ответ "HTTP 200 OK", когда на стороне сервера произошла ошибка (сведения об ошибке будут содержаться внутри тела ответа)? Допустимо для ошибок бизнес-логики приложения, однако в большинстве случаев это зависит от конкретного юзкейса. Статус "200 OK" зачастую используется только тогда, когда запрос был успешно обработан и результаты этой обработки соответствуют ожиданиям клиента. В случае возникновения ошибки следует использовать соответствующие статусы ответа HTTP, которые точно отражают природу проблемы. Например: 🔹 500 Internal Server Error — для неустранимых ошибок на стороне сервера. 🔹 503 Service Unavailable — если сервер временно недоступен, например, из-за перегрузки или технического обслуживания. 🔹 400 Bad Request — если ошибка возникла из-за некорректных данных, предоставленных клиентом. 🔹 404 Not Found — если запрос был направлен на несуществующий ресурс. 🔗 Все коды состояния ответа HTTP 🔗 Обсуждение на StackOverflow
1 82717Loading...
34
Если ты — golang-разработчик и страдаешь от недостатка профильных конференций, у нас для тебя клевая новость. Уже 13 мая стартует новый сезон Podlodka Go Crew с темой «базы данных». Мы в Podlodka организовываем онлайн-конференции по разным секциям разработки, так что тебе не придётся куда-то ехать. Все знания получишь прямо у экрана своего монитора. ⭐️ Научимся сравнивать библиотеки и ORM вместе с Арсеном Абдусаламовым из Авито. Познакомимся с решениями как можно подключаться к базам данных и узнаем про «Go way» способ. ⭐️ Попрактикуемся обращаться с распределённым MySQL с помощью Vitess вместе с Ильёй Ушаковым. Ведь одного инстанса MySQL в какой-то момент может начать не хватать. Что же делать, если переходить на NoSQL совсем неохота? Vitess — ответ на этот вопрос, золотая середина между NoSQL distributed базами данных и проверенным опытом MySQL. ⭐️ Узнаем всё о продвинутых структурах данных в Redis вместе с Олегом Арутюновым из Контура. Углубимся в преимущества и недостатки подхода, разберёмся с миграциями данных и оптимизацией базы. ⭐️ Мокать или предзаполнять базы данных? На этот вопрос ответят спикеры из Ozon Fintech. И это будет не просто доклад, а баттл: не на жизнь, а на смерть. Разберёмся, когда какой подход выбрать и стоит ли ограничиваться только одним. 🎁Бонус: публичный собес по работе с PostgreSQL. И это, естественно, не все сессии сезона. Залетай за билетом, чтобы не пропустить специализированную конференцию для Golang-разработчиков Реклама. ИП Толстая Елена Петровна
1 4632Loading...
35
💬 Как использовать io.TeeReader в Go для логирования содержимого HTTP-запроса перед его обработкой? Каковы потенциальные преимущества и ограничения такого подхода? io.TeeReader в Go используется для одновременного чтения данных из io.Reader и копирования этих данных в io.Writer. Это особенно полезно при логировании содержимого HTTP-запросов в мидлваре, позволяя одновременно читать и логировать данные, не теряя их для последующей обработки. Преимущества использования io.TeeReader включают возможность прозрачного логирования данных запроса без изменения основного потока чтения данных. Ограничение заключается в том, что использование io.TeeReader может привести к незначительному увеличению задержек из-за дополнительной операции записи во время чтения данных. 📌 Простой пример: package main import ( "fmt" "io" "io/ioutil" "log" "net/http" "strings" ) func logRequestData(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Создание буфера для логирования данных запроса var buf strings.Builder teeReader := io.TeeReader(r.Body, &buf) // Чтение и логирование содержимого запроса body, err := ioutil.ReadAll(teeReader) if err != nil { http.Error(w, "Ошибка при чтении тела запроса", http.StatusInternalServerError) return } // Запись данных обратно в тело запроса для последующей обработки r.Body = ioutil.NopCloser(strings.NewReader(buf.String())) // Вывод тела запроса в лог log.Printf("Received request with body: %s", body) // Продолжение обработки запроса next.ServeHTTP(w, r) }) } func mainHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Запрос обработан") } func main() { finalHandler := http.HandlerFunc(mainHandler) http.Handle("/", logRequestData(finalHandler)) log.Println("Сервер запущен на порту 8080") http.ListenAndServe(":8080", nil) } В примере мы создаем мидлваре, которая использует io.TeeReader для чтения тела HTTP-запроса, одновременно логируя его в stdout. Это позволяет сохранить неизменным первоначальный поток данных запроса для дальнейшей обработки в последующих обработчиках.
1 84127Loading...
36
💬 Как в Go отформатировать строку без её вывода? С использованием функции fmt.Sprintf. Она работает аналогично fmt.Printf, но вместо вывода результата в стандартный вывод, она возвращает отформатированную строку. Мы можем использовать fmt.Sprintf для создания строк с переменными или сложными форматами, которые затем могут быть использованы в коде или сохранены для последующего использования.
1 8158Loading...
37
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом. Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций. Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах. 👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
1 9244Loading...
💬 Когда процесс в Linux может не реагировать на SIGKILL? 🔸 Когда процесс является зомби-процессом, который уже завершился, но не освободил свои ресурсы. Зомби не может принимать сигналы и ожидает, что его родительский процесс считает его статус с помощью системного вызова wait. 🔸 Когда процесс находится в состоянии блокировки. Он выполняет неотменяемый системный вызов, такой как ожидание ввода-вывода или другого события, которое не наступило. Процесс не может завершиться, пока операционная система не вернет его в нормальное состояние. 🔸 Когда процесс является процессом init. Он не получает от ОС сигналов, которые не хочет обрабатывать. Процесс init может игнорировать SIGKILL, так как он является особым процессом, который отвечает за запуск и завершение других процессов.
Hammasini ko'rsatish...
👍 9❤‍🔥 2
💬 Почему crypto/rand в некоторых кейсах предпочтительнее использовать вместо math/rand для генерации ключей в Go? Когда мы работаем над проектами, связанными с генерацией ключей, будь то для шифрования или для создания уникальных идентификаторов, важны качество и безопасность этих ключей. Пакет math/rand отлично подходит для генерации псевдослучайных чисел. Но у этого метода есть серьезный недостаток: если кто-то узнает, как генерируются числа (начальное значение seed), он сможет предсказать будущие числа.

import "math/rand"

func Key() string {
    // rand.Seed(time.Now().UnixNano()) // deprecated
    r := rand.New(rand.NewSource(time.Now().UnixNano()))

    buf := make([]byte, 16)

    for i := range buf {
        buf[i] = byte(r.Intn(256))
    }

    return fmt.Sprintf("%x", buf)
}
Даже если мы инициализируем генератор с чем-то вроде текущего времени, уровень непредсказуемости или энтропии будет довольно низким. Это происходит потому, что вариации времени между запусками незначительны. С другой стороны, crypto/rand предлагает лучшее решение для генерации чисел, которые криптографически безопасны. Эта библиотека разработана для полной непредсказуемости, используя источники случайности, предоставляемые ОС, которые обычно гораздо сложнее предсказать.

import "crypto/rand"

func Key() string {
    buf := make([]byte, 16)

    _, err := rand.Read(buf)
    if err != nil {
        panic(err)
    }

    return fmt.Sprintf("%x", buf)
}
Использование crypto/rand особенно необходимо для операций, таких как шифрование, аутентификация или любой другой контекст, где безопасность имеет критическое значение. Опять же, если мы генерируем ключи для целей, не связанных с безопасностью, math/rand вполне подойдет.
Hammasini ko'rsatish...
👍 7 4
💬 Интерфейс и any (interface{}) в Go — это одно и то же? Объясните простыми словами. Нет, это не одно и то же. Интерфейсы определяют контракты для типов, которые их реализуют. any — это псевдоним для пустого интерфейса interface{}. Пустой интерфейс interface{} может содержать значение любого типа, поскольку он не требует реализации никаких методов.
Hammasini ko'rsatish...
🥱 2
💬 Интерфейс и any (interface{}) в Go — это одно и то же? Объясните простыми словами. Нет, это не одно и то же. Интерфейсы определяют контракты для типов, которые их реализуют. any — это псевдоним для пустого интерфейса— это одно и то который называется(interf Пустой интерфейсy (interface{})может содержать значение любого типа, поскольку он не требует реализации никаких методов.
Hammasini ko'rsatish...
🤔 1
⚡️Proglib запускает канал про ИИ для генерации звука Там мы будем рассказывать про все существующие нейросети, которые генерируют музыку и голос — с пошаговыми инструкциями, инструментами и лайфхаками. ⭐️генерация голоса и музыки ⭐️замена и перевод речи ⭐️распознавание звуков 👉Подписывайтесь!
Hammasini ko'rsatish...
💬 Почему pointer ресивер предпочтительнее использовать, чем value ресивер в Go? Первая причина — чтобы метод мог изменить значение, на которое указывает его ресивер. Вторая — чтобы избежать копирования значения при каждом вызове метода. Это может быть более эффективно, если ресивер, например, является большой структурой. В примере ниже, оба метода Scale и Abs имеют тип ресивер *Vertex, хотя метод Abs не должен изменять свой ресивер.

package main

import (
 "fmt"
 "math"
)

type Vertex struct {
 X, Y float64
}

func (v *Vertex) Scale(f float64) {
 v.X = v.X * f
 v.Y = v.Y * f
}

func (v *Vertex) Abs() float64 {
 return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
 v := &Vertex{3, 4}
 fmt.Printf("Before scaling: %+v, Abs: %v\n", v, v.Abs())
 v.Scale(5)
 fmt.Printf("After scaling: %+v, Abs: %v\n", v, v.Abs())
}
В общем случае, все методы для данного типа должны использовать либо только pointer ресивер, либо только value ресивер, чтобы избежать путаницы и обеспечить согласованность.
Hammasini ko'rsatish...
👍 1
💬 Поддерживается ли в Go арифметика указателей как C++ или других языках? В Go, в отличие от других языков, таких как C++, арифметика указателей не поддерживается напрямую. К примеру, нельзя прибавить или вычесть числа непосредственно у указателя, перемещая его вдоль блока памяти. Отсутствие арифметики указателей исключает целый класс ошибок, связанных с выходом за границы массива, неправильным обращением к памяти и другими подобными проблемами. Это помогает предотвратить баги и уязвимости, связанные с прямым доступом и изменением адресов памяти. Для выполнения операций, аналогичных арифметике указателей, в Go можно использовать слайсы, которые обеспечивают безопасный доступ к элементам массива и автоматически управляют размером и ёмкостью.
Hammasini ko'rsatish...
1
Photo unavailableShow in Telegram
Ответьте на 3 вопроса, чтобы получить вводные занятия к курсу «Алгоритмы и структуры данных» 🔥Получите вводные занятия, ответив на 3 вопроса – https://proglib.io/w/c2161ff4 На вводной части вас ждут: 1. Лекция «Производительность алгоритмов» от руководителя разработки Яндекс.Самокатов 2. Лекция «Итеративные сортировки и линейные сортировки» от аспирант департамента искусственного интеллекта ВШЭ 3. Практические задания после лекций 4. Ссылки на дополнительные материалы для самостоятельного изучения ⚡️Переходите и начинайте учиться уже сегодня – https://proglib.io/w/c2161ff4
Hammasini ko'rsatish...
👍 1
💬 Что произойдет, если в type switch использовать временную переменную для типа nil? Какой тип будет у этой переменной? Когда в type switch используется временная переменная для типа nil, тип этой переменной будет таким же, как и тип исходного значения, которое мы проверяем в TypeSwitchGuard. Например, если исходное значение имеет тип any, временная переменная также будет иметь тип any. Это можно проиллюстрировать следующим примером:
var x any
var y error

switch t := x.(type) {
case nil:
    y = t // Ошибка компиляции: any does not implement error
}
В этом примере код не компилируется с ошибкой, указывающей, что переменная типа any не может быть присвоена переменной типа error, так как тип any не реализует метод Error. Это подтверждает, что временная переменная t в случае nil имеет тот же тип, что и x (в данном случае any).
Hammasini ko'rsatish...
1
💬 Почему в Go лучше использовать strconv вместо fmt для преобразования в/из строки? Пакет strconv специально создан для преобразования строк, что означает, что он оптимизирован именно для них. Для наглядности рассмотрим простое сравнение производительности:

func BenchmarkFmt(b *testing.B) {
    for i := 0; i < b.N; i++ {
        _ = fmt.Sprint(i)
    }
}

func BenchmarkStrconv(b *testing.B) {
    for i := 0; i < b.N; i++ {
        _ = strconv.Itoa(i)
    }
}

BenchmarkFmt-8      23821753    50.17 ns/op    16 B/op  2 allocs/op
BenchmarkStrconv-8  100000000   11.47 ns/op     3 B/op  1 allocs/op
strconv.Itoa значительно быстрее и эффективнее с точки зрения выделения памяти по сравнению с fmt.Sprint. fmt.Sprint при этом использует рефлексию, чтобы понять, с каким типом данных работает, и определяет лучший способ форматирования его как строки. Процесс рефлексии не «бесплатный», он добавляет как время, так и накладные расходы на память, что может быть довольно значительным, когда мы обрабатываем большие объемы данных или требуется высокая производительность.
Hammasini ko'rsatish...
👍 13 3