💬 Как правильно отправить эти данные в теле HTTP POST запроса?
Для отправки данных в теле HTTP POST запроса важно знать тип содержимого. Поскольку это сырой текст, мы будем использовать тип содержимого
Интерфейс
Чтобы соответствовать требованиям, мы преобразуем тело в буфер, который реализует этот интерфейс:
data := "test data"
Для отправки данных в теле HTTP POST запроса важно знать тип содержимого. Поскольку это сырой текст, мы будем использовать тип содержимого
text/plain
. Функция http.Post
требует io.Reader
в качестве тела, а не строки или байтов:
Post(url string, contentType string, body io.Reader) (resp *http.Response, err error)
Интерфейс
Reader
определен следующим образом:
type Reader interface {
Read(p []byte) (n int, err error)
}
Чтобы соответствовать требованиям, мы преобразуем тело в буфер, который реализует этот интерфейс:
func main() {
data := "test data"
contentType := "text/plain"
body := strings.NewReader(data)
// или
// body := bytes.NewBufferString(data)
resp, err := http.Post("https://example.com", contentType, body)
// ....
}
👍18🤔2
💬 В чем заключается риск использования глобальных переменных, особенно изменяемых?
Глобальные переменные — это те, которые мы размещаем вне функций или методов, доступные для любой части нашего кода для использования и изменения. Часто они приносят больше проблем, чем пользы. Вот почему:
🔹 Отслеживание изменений затруднено: определить, где была изменена переменная
🔹 Тестирование усложняется: предположим, мы тестируем новый и старый процессы оформления заказа. Если оба теста вмешиваются в один и тот же глобальный featureConfig, мы не сможем тестировать их независимо, не мешая один другому.
🔹 Проблемы с конкурентностью: когда несколько запросов пытаются одновременно читать или изменять
📌 Что делать? Dependency injection👇
Это метод, при котором мы предоставляем объекту его потребности извне, вместо того чтобы создавать их самостоятельно или брать из глобальных переменных.
Да, этот метод делает вещи немного более сложными, но он также упрощает поддержку кода, его тестирование и поиск ошибок.
С внедрением зависимостей настройка тестов для сценариев с включенными и отключенными функциями становится простой.
Но если наши глобальные переменные не изменяются, не требуют тестирования и должны работать именно так, то в этих ситуациях использование глобальных переменных может быть более предпочтительным.
Также, если мы используем глобальные переменные, которые изменяются во время выполнения, необходимо убедиться, что мы используем техники синхронизации.
Глобальные переменные — это те, которые мы размещаем вне функций или методов, доступные для любой части нашего кода для использования и изменения. Часто они приносят больше проблем, чем пользы. Вот почему:
🔹 Отслеживание изменений затруднено: определить, где была изменена переменная
featureConfig.NewCheckoutProcessEnabled
в вашем приложении, сложно, когда любая часть кода может её изменить.🔹 Тестирование усложняется: предположим, мы тестируем новый и старый процессы оформления заказа. Если оба теста вмешиваются в один и тот же глобальный featureConfig, мы не сможем тестировать их независимо, не мешая один другому.
🔹 Проблемы с конкурентностью: когда несколько запросов пытаются одновременно читать или изменять
featureConfig
, это может привести к несоответствиям (состояние гонки).📌 Что делать? Dependency injection
Это метод, при котором мы предоставляем объекту его потребности извне, вместо того чтобы создавать их самостоятельно или брать из глобальных переменных.
Да, этот метод делает вещи немного более сложными, но он также упрощает поддержку кода, его тестирование и поиск ошибок.
С внедрением зависимостей настройка тестов для сценариев с включенными и отключенными функциями становится простой.
Но если наши глобальные переменные не изменяются, не требуют тестирования и должны работать именно так, то в этих ситуациях использование глобальных переменных может быть более предпочтительным.
Также, если мы используем глобальные переменные, которые изменяются во время выполнения, необходимо убедиться, что мы используем техники синхронизации.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Forwarded from Библиотека Go-разработчика | Golang
context.Context
?HTTP-обработчики могут использовать контекст для управления тайм-аутами запросов или отменой в рамках запроса. Тип
Context
также позволяет передавать значения (например, идентификатор пользователя, связанный с запросом) другим функциям.❓Следует ли использовать этот механизм для передачи информации по цепочке вызовов запроса? Или лучше использовать обычную структуру?
Вот две причины, по которым использование
Context
для передачи значений может быть плохой идеей:Значения в
Context
представляют собой пары ключ/значение, где ключ и значение являются пустыми интерфейсами (т. е. any
). Другими словами, значения в контексте — это как мешок со всем подряд. Компилятор не может помочь вам отловить ошибки типов или даже проверить, есть ли информация. Удачи в устранении неполадок 😉Если вы видите функцию, принимающую параметр
Context
, вы не можете сказать, что внутри. Если вы видите функцию, которая принимает параметр структуры, вы можете ясно видеть, что данные передаются, и что это за данные.❓Но разве
doSomething(ctx)
не выглядит намного чище, чем doSomething(ctx, someStruct)
?Чистый код сам по себе не является целью. Код не чист только потому, что он короткий. Код чистый, если читатель может ясно видеть, что он делает.
❓Так
context.WithValue()
следует избегать?Значения в контексте могут быть полезны, если они не критичны для бизнес-логики приложения. Например, совершенно нормально передавать идентификаторы запросов для логирования или измерения метрик. Читатель все равно сможет понять логику кода, и если что-то пойдет не так с этим идентификатором, это повлияет только на логирование или метрики приложения, но не на результат запроса.
Context
.#tip
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤1
💬 Что необходимо, чтобы две функции считались одного типа?
Чтобы две функции считались одного типа в Go, они должны иметь одинаковую сигнатуру функции.
Это означает, что они должны иметь совпадающие параметры (количество, типы) и возвращаемые значения.
Чтобы две функции считались одного типа в Go, они должны иметь одинаковую сигнатуру функции.
Это означает, что они должны иметь совпадающие параметры (количество, типы) и возвращаемые значения.
type sigFunc func(a int, b float64) (bool, error)
func functionA(a int, b float64) (bool, error) {
return true, nil
}
func functionB(a int, b float64) (bool, error) {
return false, nil
}
func main() {
var x sigFunc = functionA
x = functionB
print(x)
}
❤17
💬 Даны n каналов типа chan int. Напишите функцию на Go, которая объединит все данные из этих каналов в один и вернет его.
Для объединения данных из нескольких каналов типа
Это можно реализовать с помощью
Этот код определяет функцию
Для объединения данных из нескольких каналов типа
chan int
в один канал в Go, можно использовать функцию, которая итерируется по каждому каналу, читает данные и отправляет их в один общий канал. Это можно реализовать с помощью
select
внутри горутины для асинхронного чтения из входных каналов. Вот простой пример функции:
package main
import (
"sync"
)
func mergeChannels(channels ...chan int) chan int {
var wg sync.WaitGroup
mergedChannel := make(chan int)
// Функция для чтения данных из канала и отправки их в объединенный канал.
output := func(c chan int) {
for n := range c {
mergedChannel <- n
}
wg.Done()
}
wg.Add(len(channels))
for _, c := range channels {
go output(c)
}
// Закрытие объединенного канала после того, как все данные из входных каналов будут обработаны.
go func() {
wg.Wait()
close(mergedChannel)
}()
return mergedChannel
}
func main() {
// Пример использования функции mergeChannels
c1 := make(chan int)
c2 := make(chan int)
// Запуск примера с фиктивным заполнением каналов
go func() {
for _, n := range []int{1, 2, 3} {
c1 <- n
}
close(c1)
}()
go func() {
for _, n := range []int{4, 5, 6} {
c2 <- n
}
close(c2)
}()
merged := mergeChannels(c1, c2)
for n := range merged {
println(n)
}
}
Этот код определяет функцию
mergeChannels
, которая принимает переменное количество каналов chan int
и возвращает один канал chan int
, в который сливаются все входящие данные. Он использует пакет sync
для ожидания завершения всех операций передачи данных перед закрытием результирующего канала.🔥18👍5❤2
💬 Для чего предназначен пакет unsafe в Go?
Пакет
📌 Простой пример:
Пример демонстрирует использование
Это может быть полезно в ситуациях, где необходимо избежать дополнительного копирования данных для повышения производительности, но требуется осторожное обращение, поскольку любые изменения в возвращаемом срезе байтов могут повлиять на исходную строку и наоборот, что нарушает иммутабельность строк в Go и может привести к неопределенному поведению.
Пакет
unsafe
в Go предназначен для выполнения операций, которые выходят за рамки типобезопасного программирования, предоставляемого Go. Это позволяет напрямую работать с памятью. unsafe
используется для оптимизации или для взаимодействия с кодом, написанным на других языках, когда необходимо точное управление размещением и интерпретацией данных в памяти. Однако использование unsafe
— это легкий способ выстрелить себе в ногу, поэтому нужно соблюдать определенные правила. 📌 Простой пример:
package main
import (
"fmt"
"reflect"
"unsafe"
)
func stringToBytes(s string) []byte {
// Получаем строковый заголовок
stringHeader := (*reflect.StringHeader)(unsafe.Pointer(&s))
// Преобразуем его в заголовок среза байтов
sliceHeader := reflect.SliceHeader{
Data: stringHeader.Data,
Len: stringHeader.Len,
Cap: stringHeader.Len,
}
// Возвращаем срез, созданный на основе заголовка среза
return *(*[]byte)(unsafe.Pointer(&sliceHeader))
}
func main() {
s := "Hello, World!"
b := stringToBytes(s)
fmt.Println(s) // Выведет: Hello, World!
fmt.Println(b) // Выведет: [72 101 108 108 111 44 32 87 111 114 108 100 33]
}
Пример демонстрирует использование
unsafe
для прямого преобразования строк в срезы байтов без создания копии данных. Он работает, изменяя способ, которым Go интерпретирует область памяти, занимаемую строкой, трактуя ее как срез байтов. Это может быть полезно в ситуациях, где необходимо избежать дополнительного копирования данных для повышения производительности, но требуется осторожное обращение, поскольку любые изменения в возвращаемом срезе байтов могут повлиять на исходную строку и наоборот, что нарушает иммутабельность строк в Go и может привести к неопределенному поведению.
👍6🔥3❤1🤔1
Media is too big
VIEW IN TELEGRAM
Что нужно для счастья разработчику на Go? Интересные задачи в продуктовой разработке, когда результат можно буквально «потрогать» в виде сервера, системы хранения данных или планшета? Большое сообщество коллег, с которыми можно развиваться? Или, может, просто комфортное рабочее место — в одном из классных офисов или у себя дома?
Чтобы не выбирать что-то одно, можно прийти работать в YADRO — компанию-производителя IT-инфраструктуры, пользовательского и телеком-оборудования. На видео один из гоферов компании как раз рассказывает об актуальных задачах и жизни разработчиков в инженерной компании.
Оставить резюме можно здесь: https://clck.ru/39g5Vz
Ждут как тимлидов команд разработки, так и начинающих специалистов.
Реклама. ООО «КНС ГРУПП», ИНН 7701411241, www.yadro.com
erid: 2SDnjdLM5ow
Чтобы не выбирать что-то одно, можно прийти работать в YADRO — компанию-производителя IT-инфраструктуры, пользовательского и телеком-оборудования. На видео один из гоферов компании как раз рассказывает об актуальных задачах и жизни разработчиков в инженерной компании.
Оставить резюме можно здесь: https://clck.ru/39g5Vz
Ждут как тимлидов команд разработки, так и начинающих специалистов.
Реклама. ООО «КНС ГРУПП», ИНН 7701411241, www.yadro.com
erid: 2SDnjdLM5ow
🔥5👍3❤1👏1
Forwarded from Библиотека Go-разработчика | Golang
В Go новички часто сталкиваются с проблемой интерфейсных переменных, которым присваивае
тся
nil указатель. В таком случае, хотя значение в интерфейсе является
nil, сама переменная интерфейса не равна
nil.Пример: создаем перемен
н
ую x как указатель на
int, который по умолчанию
nil, и переменн
ую y как пустой интерфейс, который тоже
nil по умолчанию. После присваиван
ия x переменн
ой y, интерфе
йс y уже не является
nil, хо
тя x все еще
nil.
var x *int
var y any
y = x
📌 Что верне
т y == n
il? Верне
т fal
se. Это потому, что интерфейс не просто представляет значение, которое ему присвоено, а действует как контейнер для этого значения.Для проверки, является ли значение в интерфейс
е n
il, нужно использовать утверждение типа. Например, для проверки
y на n
il, используем:
y.(*int) == nil
Это показывает, что интерфейс
y
не nil
, но содержащееся в нем значение — nil
. Полный пример здесь.#tip
Please open Telegram to view this post
VIEW IN TELEGRAM
go.dev
Go Playground - The Go Programming Language
👍10
💬 Даны два канала. В первый пишутся числа. Необходимо, чтобы числа читались из первого по мере поступления, что-то с ними происходило и результат записывался во второй канал.
Для решения этой задачи можно использовать горутину, которая будет читать числа из первого канала, выполнять некоторую операцию с каждым числом (например, умножать его на 2) и отправлять результат во второй канал.
📌 Вот пример решения на Go:
🔹 Функция
🔹 В функции
🔹 Горутина
🔹 В отдельной горутине числа от 1 до 5 отправляются в
🔹 В основной горутине читаются и выводятся результаты из
Для решения этой задачи можно использовать горутину, которая будет читать числа из первого канала, выполнять некоторую операцию с каждым числом (например, умножать его на 2) и отправлять результат во второй канал.
📌 Вот пример решения на Go:
package main
import (
"fmt"
)
func processNumbers(input <-chan int, output chan<- int) {
for num := range input {
// Пример операции: умножаем число на 2
result := num * 2
output <- result
}
close(output)
}
func main() {
inputChannel := make(chan int)
outputChannel := make(chan int)
go processNumbers(inputChannel, outputChannel)
// Отправляем числа в первый канал
go func() {
for i := 1; i <= 5; i++ {
inputChannel <- i
}
close(inputChannel)
}()
// Читаем результаты из второго канала
for result := range outputChannel {
fmt.Println(result)
}
}
🔹 Функция
processNumbers
принимает два канала: input
для чтения и output
для записи. Она читает каждое число из input,
умножает его на 2 и отправляет результат в output.
После обработки всех чисел она закрывает канал output.
🔹 В функции
main,
создаются два канала: inputChannel
и outputChannel.
🔹 Горутина
processNumbers
запускается для обработки чисел, передавая ей эти каналы.🔹 В отдельной горутине числа от 1 до 5 отправляются в
inputChannel,
после чего канал закрывается.🔹 В основной горутине читаются и выводятся результаты из
outputChannel.
🥱13👍10❤3
💬 Почему Go выбирают для облачной разработки и решения задач DevOps?
☑️ Обширная стандартная библиотека
☑️ Кросс-платформенная компиляция
☑️ Экосистема и инструментарий (управление зависимостями, обработка ошибок, тестирование, профилирование и многое другое)
☑️ Простота и скорость разработки
☑️ Сборка мусора, о которой не надо задумываться
☑️ Строгая типизация
☑️ Встроенная поддержка конкурентности
☑️ Высокая производительность
Пишите в комментарии, если хотите что-то добавить/исправить👇
☑️ Обширная стандартная библиотека
☑️ Кросс-платформенная компиляция
☑️ Экосистема и инструментарий (управление зависимостями, обработка ошибок, тестирование, профилирование и многое другое)
☑️ Простота и скорость разработки
☑️ Сборка мусора, о которой не надо задумываться
☑️ Строгая типизация
☑️ Встроенная поддержка конкурентности
☑️ Высокая производительность
Пишите в комментарии, если хотите что-то добавить/исправить👇
💬 Почему порядок обхода элементов в map является случайным?
Главная причина — предотвращение зависимости от порядка элементов. При итерации по элементам
Это сделано, чтобы разработчики не полагались на порядок при написании кода, что могло бы привести к непредсказуемым багам при изменении содержимого мапы.
Случайность порядка обхода напоминает разработчикам о том, что структура данных
Внутренняя реализация
Главная причина — предотвращение зависимости от порядка элементов. При итерации по элементам
map,
Go специально не гарантирует никакого порядка. Это сделано, чтобы разработчики не полагались на порядок при написании кода, что могло бы привести к непредсказуемым багам при изменении содержимого мапы.
Случайность порядка обхода напоминает разработчикам о том, что структура данных
map
не предназначена для хранения элементов в упорядоченном виде.Внутренняя реализация
map
в Go предназначена для быстрого доступа, добавления и удаления элементов, а не для поддержания элементов в определенном порядке. Эффективность операций с мапой имеет более высокий приоритет, чем сохранение порядка элементов.👍12
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
💬 Как удалить элемент из среза в Go без использования стандартной библиотеки?
👉 Если порядок важен
Чтобы удалить элемент из середины среза и сохранить порядок оставшихся элементов, можно использовать
Это объединяет часть среза до удаляемого элемента с частью среза после удаляемого элемента, исключая сам удаляемый элемент, но сохраняя порядок оставшихся элементов.
👉 Если порядок не важен
В случае, когда сохранение исходного порядка элементов не является приоритетом, можно выполнить удаление элемента, заменив его последним элементом среза, а затем уменьшить длину среза. Это эффективнее, так как не требует перемещения элементов:
Этот метод эффективно удаляет элемент, заменяя его последним элементом среза, и уменьшает размер среза, исключая последний элемент.
👉 Удаление из начала или конца
Если элемент для удаления находится в начале или в конце среза, можно просто использовать срезы:
📌 Для удаления первого элемента:
📌 Для удаления последнего элемента:
👉 Если порядок важен
Чтобы удалить элемент из середины среза и сохранить порядок оставшихся элементов, можно использовать
append
:
newSlice := append(slice[:index], slice[index+1:]...)
Это объединяет часть среза до удаляемого элемента с частью среза после удаляемого элемента, исключая сам удаляемый элемент, но сохраняя порядок оставшихся элементов.
👉 Если порядок не важен
В случае, когда сохранение исходного порядка элементов не является приоритетом, можно выполнить удаление элемента, заменив его последним элементом среза, а затем уменьшить длину среза. Это эффективнее, так как не требует перемещения элементов:
slice[index] = slice[len(slice)-1]
newSlice := slice[:len(slice)-1]
Этот метод эффективно удаляет элемент, заменяя его последним элементом среза, и уменьшает размер среза, исключая последний элемент.
👉 Удаление из начала или конца
Если элемент для удаления находится в начале или в конце среза, можно просто использовать срезы:
📌 Для удаления первого элемента:
newSlice := slice[1:]
📌 Для удаления последнего элемента:
newSlice := slice[:len(slice)-1]
👍21
💬 Как в Go преобразовать строку в число и обратно, и как обрабатывать возможные ошибки при этих преобразованиях?
В Go для преобразования строки в число и обратно используются функции из пакета
🔹 Преобразование строки в число
Чтобы преобразовать строку в число, можно использовать функции как
🔹 Преобразование числа в строку
Для преобразования числа в строку используется функция
В Go для преобразования строки в число и обратно используются функции из пакета
strconv
. При преобразовании строки в число необходимо учитывать возможные ошибки, так как входная строка может не быть корректно преобразована в числовой формат.🔹 Преобразование строки в число
Чтобы преобразовать строку в число, можно использовать функции как
strconv.Atoi
для целых чисел или strconv.ParseFloat
для чисел с плавающей точкой.
package main
import (
"fmt"
"strconv"
)
func main() {
// Преобразование строки в целое число
strInt := "123"
intValue, err := strconv.Atoi(strInt)
if err != nil {
fmt.Println("Ошибка преобразования:", err)
} else {
fmt.Println("Целое число:", intValue)
}
// Преобразование строки в число с плавающей точкой
strFloat := "123.45"
floatValue, err := strconv.ParseFloat(strFloat, 64) // 64 указывает на то, что результат будет float64
if err != nil {
fmt.Println("Ошибка преобразования:", err)
} else {
fmt.Println("Число с плавающей точкой:", floatValue)
}
}
🔹 Преобразование числа в строку
Для преобразования числа в строку используется функция
strconv.Itoa
для целых чисел или fmt.Sprintf
для чисел с плавающей точкой или других форматов. Например:
package main
import (
"fmt"
"strconv"
)
func main() {
// Преобразование целого числа в строку
intValue := 123
strInt := strconv.Itoa(intValue)
fmt.Println("Строка:", strInt)
// Преобразование числа с плавающей точкой в строку
floatValue := 123.45
strFloat := fmt.Sprintf("%f", floatValue)
fmt.Println("Строка:", strFloat)
}
🔥7👍3❤1
💬 В каких кейсах используется указатель на структуру в Go?
1. Когда структура передается в функцию по значению, Go создаёт её копию. Чтобы изменения внутри функции отражались на самой структуре, следует передавать указатель на неё.
2. Передача структур через указатели эффективнее по памяти, особенно для больших структур, потому что передается только адрес памяти, а не вся структура.
3. Использование указателей может улучшить производительность программы, снижая накладные расходы на копирование больших структур данных при передаче их между функциями.
4. Указатели на структуры могут быть
5. Структуры могут реализовывать интерфейсы, и указатели на эти структуры могут быть переданы функциям, ожидающим интерфейс. Это позволяет работать с разными типами данных через общий интерфейс.
1. Когда структура передается в функцию по значению, Go создаёт её копию. Чтобы изменения внутри функции отражались на самой структуре, следует передавать указатель на неё.
2. Передача структур через указатели эффективнее по памяти, особенно для больших структур, потому что передается только адрес памяти, а не вся структура.
3. Использование указателей может улучшить производительность программы, снижая накладные расходы на копирование больших структур данных при передаче их между функциями.
4. Указатели на структуры могут быть
nil
, что позволяет использовать их для реализации опциональных полей или для указания на отсутствие конкретного значения.5. Структуры могут реализовывать интерфейсы, и указатели на эти структуры могут быть переданы функциям, ожидающим интерфейс. Это позволяет работать с разными типами данных через общий интерфейс.
👍9😁7❤3
💬 Имеет ли значение порядок полей в структуре Go?
Да, порядок полей в структуре в Go имеет значение, особенно когда речь идет о выравнивании памяти и оптимизации использования памяти.
В Go, компилятор учитывает выравнивание памяти, чтобы обеспечить более эффективный доступ к данным и уменьшить объем занимаемой памяти.
📌 Несколько аспектов, по которым порядок полей может быть важен:
1. Каждый тип данных имеет требования к выравниванию, что значит, что данные этого типа должны начинаться с определенного адреса в памяти. Например, тип
2. Порядок полей может влиять на общий размер структуры из-за вышеупомянутых "дыр". Путем рационального упорядочивания полей можно минимизировать эти "дыры" и сделать размер структуры меньше.
3. Эффективное выравнивание памяти может улучшить производительность приложения, так как процессоры обращаются к выровненной памяти быстрее. Неправильное выравнивание может привести к дополнительным затратам циклов процессора для доступа к данным.
Да, порядок полей в структуре в Go имеет значение, особенно когда речь идет о выравнивании памяти и оптимизации использования памяти.
В Go, компилятор учитывает выравнивание памяти, чтобы обеспечить более эффективный доступ к данным и уменьшить объем занимаемой памяти.
📌 Несколько аспектов, по которым порядок полей может быть важен:
1. Каждый тип данных имеет требования к выравниванию, что значит, что данные этого типа должны начинаться с определенного адреса в памяти. Например, тип
int64
в Go обычно требует выравнивания по 8-байтной границе. Если поля в структуре расположены таким образом, что между полями образуются "дыры" из-за выравнивания, это может привести к неэффективному использованию памяти.2. Порядок полей может влиять на общий размер структуры из-за вышеупомянутых "дыр". Путем рационального упорядочивания полей можно минимизировать эти "дыры" и сделать размер структуры меньше.
3. Эффективное выравнивание памяти может улучшить производительность приложения, так как процессоры обращаются к выровненной памяти быстрее. Неправильное выравнивание может привести к дополнительным затратам циклов процессора для доступа к данным.
👍19🥱1
💬 Что из себя представляют термины "zombie" и "orphan" в контексте операционной системы Linux?
Они описывают два различных состояния процессов:
1. Zombie process (зомби-процесс) — процесс, который завершил свое выполнение, но все еще присутствует в системе в качестве записи в таблице процессов. Это происходит потому, что процесс завершился, но его родительский процесс еще не вызвал системный вызов
Пока родитель не вызовет
2. Orphan Process (процесс-сирота) — процесс, чей родительский процесс завершился, оставив процесс без непосредственного предка в системе. В Linux и других UNIX-подобных системах, когда родительский процесс завершается, все его «сиротские» дочерние процессы автоматически «усыновляются» процессом с PID 1, который обычно является процессом
Они описывают два различных состояния процессов:
1. Zombie process (зомби-процесс) — процесс, который завершил свое выполнение, но все еще присутствует в системе в качестве записи в таблице процессов. Это происходит потому, что процесс завершился, но его родительский процесс еще не вызвал системный вызов
wait()
, который "собирает" статус завершения процесса-потомка. Пока родитель не вызовет
wait()
, зомби-процесс будет оставаться в системе с освобожденными ресурсами, но сохранившейся записью в таблице процессов. Это состояние позволяет родителю получить информацию о статусе завершения процесса-потомка.2. Orphan Process (процесс-сирота) — процесс, чей родительский процесс завершился, оставив процесс без непосредственного предка в системе. В Linux и других UNIX-подобных системах, когда родительский процесс завершается, все его «сиротские» дочерние процессы автоматически «усыновляются» процессом с PID 1, который обычно является процессом
init
или его современной заменой, например, systemd
. Этот процесс становится новым родителем процессов-сирот и отвечает за их завершение и очистку ресурсов.👍22❤1
💬 Гарантирует ли порядок выполнения конструкция select-case в Go?
Конструкция
Это помогает предотвратить блокировку и гарантировать, что все горутины имеют равные шансы на выполнение.
Если ни один из кейсов не готов, программа будет ждать, пока хотя бы один кейс не станет доступен, если только не предоставлен кейс
Конструкция
select-case
в Go не гарантирует порядок выполнения своих веток. Если в нескольких кейсах операции готовы к выполнению одновременно, выбор конкретного кейса для выполнения происходит случайным образом. Это помогает предотвратить блокировку и гарантировать, что все горутины имеют равные шансы на выполнение.
Если ни один из кейсов не готов, программа будет ждать, пока хотя бы один кейс не станет доступен, если только не предоставлен кейс
default
, который выполняется немедленно, когда другие кейсы не готовы.👍6
Самые полезные каналы для программистов в одной подборке!
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
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 запрещена на территории РФ
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
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 запрещена на территории РФ
❤2👍1