Golang | Вопросы собесов
4.33K subscribers
27 photos
696 links
Download Telegram
🤔 Что такое хэш-коллизия ?

Хэш-коллизия — это случай, когда два разных входных значения генерируют один и тот же хэш-код. Это происходит из-за ограниченного числа возможных хэш-значений, которые могут привести к повторениям при большом количестве входных данных.

🚩Как возникают коллизии?

Принимает входные данные (например, строку или целое число) и возвращает фиксированное значение, которое обычно используется для индексирования массива или другого контейнера данных. Однако, поскольку количество возможных входных данных потенциально бесконечно, а количество возможных выходных значений хэш-функции ограничено, неизбежно возникают ситуации, когда разные входные данные производят одинаковое хэш-значение. Это и называется хэш-коллизией. Представим, что у нас есть простая хэш-функция для строк, которая возвращает длину строки в качестве хэш-значения. Для строк "cat" и "dog" хэш-значение будет одинаковым (3), что приводит к коллизии.

🚩Управление коллизиями

Существует несколько методов для управления хэш-коллизиями. Два наиболее распространенных метода — это цепочки (chaining) и открытая адресация (open addressing).

🟠Цепочки (Chaining)
В этом методе каждая ячейка хэш-таблицы содержит указатель на список (например, связанный список) всех элементов, которые имеют одно и то же хэш-значение. Когда происходит коллизия, новый элемент просто добавляется в этот список.
type Entry struct {
key string
value int
next *Entry
}

type HashMap struct {
buckets []*Entry
}

func (m *HashMap) Put(key string, value int) {
index := hash(key) % len(m.buckets)
entry := m.buckets[index]
for entry != nil {
if entry.key == key {
entry.value = value
return
}
entry = entry.next
}
m.buckets[index] = &Entry{key: key, value: value, next: m.buckets[index]}
}

func hash(key string) int {
hash := 0
for _, char := range key {
hash += int(char)
}
return hash
}


🟠Открытая адресация (Open Addressing)
В этом методе все элементы хранятся непосредственно в хэш-таблице. Если ячейка, определенная хэш-функцией, уже занята, используется альтернативная стратегия для нахождения следующей доступной ячейки. Наиболее распространенные стратегии включают линейное пробирование (linear probing), квадратичное пробирование (quadratic probing) и двойное хеширование (double hashing).
type HashMap struct {
keys []string
values []int
size int
}

func (m *HashMap) Put(key string, value int) {
index := hash(key) % len(m.keys)
for m.keys[index] != "" {
if m.keys[index] == key {
m.values[index] = value
return
}
index = (index + 1) % len(m.keys)
}
m.keys[index] = key
m.values[index] = value
m.size++
}

func hash(key string) int {
hash := 0
for _, char := range key {
hash += int(char)
}
return hash
}


Ставь 👍 и забирай
📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что можешь сказать о HTTP3?

HTTP/3 — это последняя версия протокола HTTP, предназначенная для передачи данных в интернете. Эта версия включает несколько значительных улучшений по сравнению с предыдущими версиями, в частности благодаря использованию протокола QUIC.

🚩Основные особенности HTTP/3

🟠Использование QUIC:
QUIC (Quick UDP Internet Connections) разработан Google и работает поверх UDP, а не TCP. Обеспечить более быструю и надежную передачу данных, улучшить производительность и сократить задержки.

🟠Ускоренное установление соединений:
QUIC значительно сокращает время на установление соединения по сравнению с TCP. Благодаря интеграции с TLS, процесс безопасности и установка соединения происходят одновременно.

🟠Улучшенная устойчивость к потерям пакетов:
В HTTP/3 каждый поток данных передается независимо, что предотвращает блокировку одного потока из-за потери пакетов в другом потоке, что является недостатком HTTP/2.

🟠Мультиплексирование:
HTTP/3 позволяет отправлять несколько запросов и получать ответы через одно соединение одновременно без блокировок, что ускоряет передачу данных и повышает эффективность использования соединений.

🟠Сжатие заголовков:
Новый механизм сжатия заголовков, улучшенный по сравнению с HPACK в HTTP/2, который учитывает особенности QUIC и уменьшает задержки.

🟠Серверное push-сообщение:
Как и в HTTP/2, HTTP/3 поддерживает серверное push-сообщение, позволяя серверу отправлять данные клиенту до их запроса, что ускоряет загрузку страниц.
🚩Плюсы

Скорость и производительность:
Быстрое установление соединений и устойчивость к потерям пакетов делают HTTP/3 значительно быстрее, особенно в условиях ненадежных сетей.

Низкие задержки:
Независимая передача потоков данных и улучшенное мультиплексирование снижают задержки при загрузке страниц и передачи данных.

Надежность:
Улучшенная устойчивость к сетевым сбоям и потерям пакетов делает соединения более надежными и стабильными.

🚩Минусы

Совместимость:
Поскольку HTTP/3 использует QUIC и UDP, а не TCP, некоторые старые или ограниченные сети и устройства могут не поддерживать этот протокол.

Сложность реализации:
Внедрение и поддержка HTTP/3 требуют новых знаний и навыков, что может усложнить разработку и администрирование.

Инфраструктурные изменения:
Переход на HTTP/3 может требовать обновления серверного оборудования и программного обеспечения для полной поддержки нового протокола.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какой интерфейс должен реализовывать тип, чтобы его можно было использовать в качестве ключа в map?
Anonymous Quiz
25%
hashable
65%
comparable
8%
keyable
3%
equatable
🤔 Что такое NAT?

Это технология, используемая для изменения сетевых адресов в заголовках пакетов данных, которые проходят через маршрутизатор или межсетевой экран. Она позволяет нескольким устройствам в локальной сети использовать один и тот же публичный IP-адрес для выхода в интернет.

🚩Основные типы

🟠Статический NAT (Static NAT):
Фиксированный сопоставление: Один внутренний IP-адрес сопоставляется с одним внешним IP-адресом. Используется, когда необходимо, чтобы устройство в локальной сети всегда было доступно под одним и тем же публичным IP-адресом. Например Веб-сервер, который должен быть доступен из интернета под фиксированным IP-адресом.

🟠Динамический NAT (Dynamic NAT):
Внутренние IP-адреса сопоставляются с пулом внешних IP-адресов. Когда внутреннее устройство инициирует соединение с интернетом, ему временно присваивается один из доступных внешних IP-адресов. Например, локальная сеть с большим количеством устройств, где не требуется фиксированный внешний IP-адрес для каждого устройства.

🟠Преобразование адресов и портов (PAT, Port Address Translation), также известный как Маскарадинг (Masquerading):
Несколько внутренних IP-адресов могут использовать один внешний IP-адрес, но различаются по номерам портов. Каждый внутренний IP-адрес и порт сопоставляется с уникальным внешним портом. Например, Домашние или офисные сети, где множество устройств выходят в интернет через один публичный IP-адрес.

🚩Зачем нужен

🟠Сохранение IP-адресов:
IPv4-адресов недостаточно для всех устройств, и NAT позволяет использовать один публичный IP-адрес для множества устройств.

🟠Безопасность:
Внутренние IP-адреса не видны извне, что усложняет потенциальным злоумышленникам попытки атак на внутренние устройства.

🟠Управление подключениями:
NAT позволяет администрировать и контролировать сетевой трафик, предоставляя возможности для управления доступом и приоритизацией трафика.

🚩Принцип работы

🟠Инициирование соединения:
Когда устройство в локальной сети (например, компьютер с IP-адресом 192.168.1.10) инициирует соединение с устройством в интернете, NAT изменяет исходящий IP-адрес и порт на внешний IP-адрес маршрутизатора и уникальный номер порта.

🟠Ответный трафик:
Когда ответный пакет возвращается, NAT использует таблицу сопоставлений, чтобы определить, к какому внутреннему устройству направить пакет, и изменяет внешний IP-адрес и порт обратно на внутренний IP-адрес и порт.

🚩Пример работы PAT

1⃣Внутренний компьютер с IP-адресом 192.168.1.10 и портом 12345 инициирует соединение.
2⃣NAT изменяет это на внешний IP-адрес 203.0.113.1 и порт 54321.
3⃣Ответный пакет от сервера приходит на IP-адрес 203.0.113.1 и порт 54321.
4⃣NAT преобразует это обратно в 192.168.1.10:12345 и отправляет пакет внутреннему компьютеру.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как в Go создаются именованные возвращаемые значения?
Anonymous Quiz
71%
func f() (result int)
9%
func f() (result: int)
16%
func f() int result
4%
func f() (result = int)
🤔 Как произвести дебаг protobuff?

Отладка протокола Protocol Buffers (protobuf) может быть сложной задачей, особенно если вы работаете с бинарным форматом данных. Тем не менее, существует несколько шагов и инструментов, которые могут помочь вам в этом процессе. Вот некоторые из них:

🟠Использование текстового формата
Protocol Buffers поддерживают сериализацию данных в текстовом формате, который проще для чтения и отладки. Вы можете конвертировать бинарные данные в текстовый формат для более удобной отладки.
// message.proto
syntax = "proto3";

message Person {
string name = 1;
int32 id = 2;
string email = 3;
}

// main.go
package main

import (
"fmt"
"log"

"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/proto"
"your_project_path/your_proto_package" // заменить на реальный путь
)

func main() {
person := &your_proto_package.Person{
Name: "John Doe",
Id: 123,
Email: "john.doe@example.com",
}

// Сериализация в бинарный формат
data, err := proto.Marshal(person)
if err != nil {
log.Fatalf("Failed to marshal: %v", err)
}

// Десериализация обратно в текстовый формат для отладки
person2 := &your_proto_package.Person{}
err = proto.Unmarshal(data, person2)
if err != nil {
log.Fatalf("Failed to unmarshal: %v", err)
}

jsonString, err := protojson.Marshal(person2)
if err != nil {
log.Fatalf("Failed to marshal to JSON: %v", err)
}

fmt.Println(string(jsonString))
}


🟠Использование Protobuf декодеров и редакторов
protoc: Официальный компилятор protobuf, который может генерировать текстовые представления сообщений.
protoc-gen-json: Плагин для protoc, который позволяет сериализовать сообщения в формат JSON.
protoc-inspector: Утилита для визуализации и отладки protobuf сообщений.

🟠Проверка схемы (Proto File)
Убедитесь, что ваша .proto схема правильна и соответствует структуре данных, которую вы пытаетесь сериализовать и десериализовать. Ошибки в схеме могут привести к неправильной сериализации и десериализации данных.

🟠Логирование и трассировка
Добавление логирования и трассировки в код может помочь отслеживать, где происходят ошибки при работе с protobuf.
// main.go
package main

import (
"fmt"
"log"

"google.golang.org/protobuf/proto"
"your_project_path/your_proto_package" // заменить на реальный путь
)

func main() {
person := &your_proto_package.Person{
Name: "John Doe",
Id: 123,
Email: "john.doe@example.com",
}

// Логируем данные до сериализации
fmt.Printf("Before Marshal: %+v\n", person)

// Сериализация в бинарный формат
data, err := proto.Marshal(person)
if err != nil {
log.Fatalf("Failed to marshal: %v", err)
}

// Логируем бинарные данные
fmt.Printf("Binary data: %v\n", data)

// Десериализация
person2 := &your_proto_package.Person{}
err = proto.Unmarshal(data, person2)
if err != nil {
log.Fatalf("Failed to unmarshal: %v", err)
}

// Логируем данные после десериализации
fmt.Printf("After Unmarshal: %+v\n", person2)
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Какие бывают версии HTTP?

HTTP (HyperText Transfer Protocol) — это протокол, используемый для передачи данных в интернете.

🚩Основные версии HTTP.

🟠HTTP/0.9
Год выпуска: 1991

Особенности
Первая версия HTTP, очень простая. Поддерживала только GET-запросы. Отсутствие заголовков, только один объект мог быть передан в ответ на запрос.

Использование:
В настоящее время практически не используется.

🟠HTTP/1.0
Год выпуска: 1996

Особенности
Введены методы запроса, такие как GET, POST и HEAD. Поддержка заголовков для метаданных. Каждый запрос/ответ требует нового соединения, что делает передачу данных менее эффективной.

Использование
Исторически важен, но также почти не используется в современных приложениях.

🟠HTTP/1.1
Год выпуска: 1997

Особенности
Поддержка устойчивых (persistent) соединений, что позволяет повторное использование одного соединения для нескольких запросов/ответов. Введены дополнительные методы запросов, такие как OPTIONS, PUT, DELETE, TRACE и CONNECT. Поддержка chuncked transfer encoding для передачи данных по частям. Улучшена работа с кэшированием и аутентификацией.

Использование
Широко используется и в настоящее время, хотя многие системы переходят на HTTP/2.

🟠HTTP/2
Год выпуска: 2015

Особенности
Бинарный протокол, что улучшает производительность и уменьшает количество ошибок. Поддержка мультиплексирования, что позволяет отправлять несколько запросов через одно соединение одновременно, уменьшая задержки. Сжатие заголовков, что уменьшает объем передаваемых данных. Серверное push-сообщение (server push), позволяющее серверу отправлять данные клиенту до того, как он их запросит.

Использование
Быстро набирает популярность благодаря улучшенной производительности и эффективности.

🟠HTTP/3
Год выпуска: 2022 (черновая версия в 2020)

Особенности
Основан на протоколе QUIC, который работает поверх UDP, а не TCP. Поддержка улучшенного мультиплексирования и быстрого установления соединений. Лучшая устойчивость к потерям пакетов и более высокая скорость передачи данных по сравнению с HTTP/2.

Использование
Внедрение продолжается, но многие крупные интернет-компании, такие как Google и Facebook, уже активно используют HTTP/3.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Опишите плюсы и минусы монолита?

🚩Плюсы

Разработки и отладки:
Весь код находится в одном проекте, что упрощает понимание, разработку и отладку. Разработчики могут легко работать с общей кодовой базой.

Развертывания:
Приложение разворачивается как единое целое, что упрощает процесс развертывания. Нет необходимости координировать развертывание множества сервисов.

Производительность:
Взаимодействие между компонентами происходит внутри одного процесса, что устраняет сетевые задержки и обеспечивает более быструю работу.

Целостность данных:
Все компоненты приложения имеют доступ к одной базе данных, что упрощает управление транзакциями и консистентностью данных.

Меньшие затраты на инфраструктуру:
Поскольку приложение развертывается как единое целое, инфраструктурные расходы на управление сетью, оркестрацию и мониторинг меньше по сравнению с микросервисной архитектурой.

🚩Минусы

Трудности с масштабированием:
Масштабировать приложение приходится целиком, что может быть неэффективно. Если только одна часть приложения испытывает высокую нагрузку, всю систему нужно масштабировать, что приводит к избыточным затратам.

Сложность поддержки и обновления:
По мере роста приложения кодовая база становится более сложной, что затрудняет поддержку и внесение изменений. Даже небольшие изменения могут потребовать повторного тестирования и развертывания всего приложения.

Ограниченная гибкость технологий:
Все компоненты должны использовать одну и ту же технологическую платформу, что ограничивает возможность выбора лучших инструментов и фреймворков для разных частей приложения.

Длительное время развертывания:
Развертывание монолитного приложения может занять больше времени, особенно если оно стало большим и сложным. Это замедляет процесс выпуска обновлений.

Зависимость компонентов:
Высокая степень связанности компонентов может привести к проблемам, когда сбой в одном компоненте может повлиять на всю систему.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Опишите плюсы и минусы микросервисной архитектуры?

🚩Плюсы

Масштабируемость:
Легко масштабировать отдельные компоненты системы независимо друг от друга. Например, если один микросервис испытывает высокую нагрузку, его можно масштабировать, не затрагивая другие части системы.

Независимое развертывание:
Каждый микросервис может разрабатываться, тестироваться и развертываться независимо от других, что сокращает время разработки и улучшает скорость выпуска обновлений.

Гибкость технологий:
Разработчики могут использовать разные технологии, языки программирования и фреймворки для разных микросервисов, выбирая наиболее подходящие инструменты для каждой конкретной задачи.

Устойчивость и изоляция ошибок:
Проблемы в одном микросервисе не приводят к сбою всего приложения. Это повышает устойчивость системы в целом, так как сбои ограничены контекстом конкретного микросервиса.

Производительность команд:
Маленькие независимые команды могут работать над отдельными микросервисами, что повышает продуктивность и ускоряет разработку новых функций.

Упрощение разработки и поддержки:
Система делится на более мелкие и управляемые части, что облегчает понимание кода и упрощает поддержку.

🚩 Минусы

Сложность управления:
Управление множеством микросервисов требует эффективной оркестрации и мониторинга. Это приводит к необходимости использования сложных инструментов и дополнительных затрат на администрирование.

Сетевые задержки и производительность:
Взаимодействие между микросервисами происходит через сеть, что может привести к увеличению задержек и необходимости управления сетевой нагрузкой.

Повышенная сложность разработки:
Разработка и тестирование распределённой системы сложнее, чем монолита. Требуется учитывать межсервисное взаимодействие, консистентность данных и возможные сбои в сети.

Трудности с данными:
Разделение данных между микросервисами может привести к дублированию данных и усложнению управления транзакциями, особенно если нужна консистентность данных между сервисами.

Интеграция и совместимость:
Поддержание совместимости между различными микросервисами и обеспечение их корректного взаимодействия требует дополнительного контроля и тестирования.

Управление конфигурацией:
Управление конфигурацией для множества микросервисов становится сложнее, так как каждая служба может иметь свои собственные настройки и зависимости.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Насколько безопасно передавать слайсы в разные горутины?

Передача слайсов в разные горутины в Go может быть как безопасной, так и небезопасной в зависимости от контекста использования. Давайте рассмотрим, почему это так, и какие подходы позволяют обеспечить безопасность.

🚩Почему это важно

Слайсы в Go являются ссылочными типами, что означает, что они содержат указатель на массив в памяти, длину и емкость. Если несколько горутин одновременно модифицируют один и тот же слайс или его элементы, это может привести к состояниям гонки, некорректным данным и другим непредсказуемым результатам.

🚩Безопасная передача слайсов

🟠Только чтение:
Если слайс передается в горутины только для чтения, это безопасно. Одновременное чтение данных не вызывает конфликтов. В этом примере горутины только читают значения из слайса, что безопасно.
package main

import (
"fmt"
"sync"
)

func main() {
slice := []int{1, 2, 3, 4, 5}
var wg sync.WaitGroup

for _, v := range slice {
wg.Add(1)
go func(val int) {
defer wg.Done()
fmt.Println(val)
}(v)
}

wg.Wait()
}


🟠Копирование слайса:
Если каждая горутина должна иметь независимую копию данных, можно передать копию слайса. Это устраняет возможность конфликтов при записи.
package main

import (
"fmt"
"sync"
)

func main() {
originalSlice := []int{1, 2, 3, 4, 5}
var wg sync.WaitGroup

for _, v := range originalSlice {
wg.Add(1)
go func(val int) {
defer wg.Done()
newSlice := make([]int, len(originalSlice))
copy(newSlice, originalSlice)
newSlice[0] = val
fmt.Println(newSlice)
}(v)
}

wg.Wait()
}


🟠Синхронизация доступа:
Если горутины должны одновременно читать и модифицировать слайс, необходимо использовать механизмы синхронизации, такие как мьютексы или каналы, чтобы обеспечить безопасный доступ к данным.
package main

import (
"fmt"
"sync"
)

func main() {
slice := []int{1, 2, 3, 4, 5}
var wg sync.WaitGroup
var mu sync.Mutex

for i := range slice {
wg.Add(1)
go func(index int) {
defer wg.Done()
mu.Lock()
slice[index] *= 2
mu.Unlock()
}(i)
}

wg.Wait()
fmt.Println(slice)
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое РПС?

РПС (RPC, Remote Procedure Call) — это технология, которая позволяет программе вызывать функции (процедуры) на удалённых машинах, как если бы они были локальными. В контексте программирования на Go, РПС используется для организации взаимодействия между разными частями распределённых систем.

🚩Зачем нужен РПС

🟠Распределённые системы:
В современных приложениях часто необходимо взаимодействовать с различными сервисами, которые могут находиться на разных серверах. РПС позволяет реализовать это взаимодействие простым и прозрачным способом.
🟠Микросервисы:
В архитектуре микросервисов разные части системы выполняются как независимые сервисы. РПС обеспечивает эффективное и удобное взаимодействие между этими сервисами.
🟠Производительность и масштабируемость:
РПС позволяет распределить нагрузку между несколькими серверами, что повышает производительность и масштабируемость системы.

🚩Как используется РПС в Go

🟠В языке Go для реализации РПС используется стандартная библиотека net/rpc, а также сторонние библиотеки, такие как gRPC, которые обеспечивают более широкие возможности и поддержку разных протоколов.
// Сервисная часть

package main

import (
"net"
"net/rpc"
)

// Определяем структуру и методы, которые будут доступны через RPC
type Arith int

func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}

type Args struct {
A, B int
}

func main() {
arith := new(Arith)
rpc.Register(arith)
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("Listen error: ", err)
}
rpc.Accept(listener)
}


🟠В этом примере мы определяем серверную часть, которая предоставляет метод Multiply для умножения двух чисел, и клиентскую часть, которая вызывает этот метод на удалённом сервере.
// Клиентская часть

package main

import (
"fmt"
"log"
"net/rpc"
)

type Args struct {
A, B int
}

func main() {
client, err := rpc.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal("Dialing error: ", err)
}

args := Args{2, 3}
var reply int
err = client.Call("Arith.Multiply", &args, &reply)
if err != nil {
log.Fatal("Arith error: ", err)
}
fmt.Printf("Result: %d\n", reply)
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое HTTPS?

HTTPS (HyperText Transfer Protocol Secure) — это расширение протокола HTTP, которое обеспечивает безопасную передачу данных между веб-браузером пользователя и сервером. HTTPS использует протоколы шифрования, такие как TLS (Transport Layer Security) или его предшественник SSL (Secure Sockets Layer), чтобы защитить передаваемые данные от перехвата и манипуляций.

🚩Основные функции

🟠Шифрование:
Защита данных от перехвата посторонними лицами. Данные, передаваемые между клиентом и сервером, шифруются с помощью симметричного шифрования, а ключи для этого шифрования обмениваются с использованием асимметричного шифрования.

🟠Аутентификация:
Подтверждение подлинности сервера (и иногда клиента) с помощью цифровых сертификатов. Сертификаты, выданные доверенными центрами сертификации (CA), подтверждают, что сервер принадлежит законному владельцу.

🟠Целостность данных:
Обеспечение защиты данных от изменения во время передачи. Хеш-функции и контрольные суммы используются для проверки целостности передаваемых данных.

🚩Как работает

1⃣Установка защищенного соединения:
Клиент отправляет запрос на сервер, указывая, что хочет установить защищенное соединение (например, https://example.com). Сервер отвечает, отправляя свой цифровой сертификат, который содержит публичный ключ сервера и данные о сервере.

2⃣Проверка сертификата:
Клиент проверяет сертификат с помощью списка доверенных центров сертификации (CA), чтобы удостовериться в подлинности сервера.

3⃣Создание сессионных ключей:
Клиент и сервер используют асимметричное шифрование для обмена сессионными ключами. Эти ключи будут использоваться для симметричного шифрования данных во время сессии.

4⃣Шифрование данных:
После установки защищенного соединения все данные между клиентом и сервером передаются в зашифрованном виде с использованием сессионных ключей.

🚩Плюсы

Безопасность:
Шифрование данных защищает их от перехвата и кражи, особенно на общественных сетях и Wi-Fi.
Доверие пользователей:
Наличие HTTPS улучшает доверие пользователей к веб-сайту, что может повысить количество посетителей и конверсии.
SEO-приоритеты:
Поисковые системы, такие как Google, дают предпочтение сайтам, использующим HTTPS, в своих рейтингах.
Защита от атак:
HTTPS помогает защититься от атак типа "человек посередине" (MITM), при которых злоумышленники могут перехватывать и изменять данные.

🚩Минусы

Производительность:
Установка и поддержка защищенного соединения требует дополнительных вычислительных ресурсов, что может немного замедлить загрузку страниц.
Стоимость:
Приобретение и обновление сертификатов могут требовать дополнительных затрат, хотя существуют и бесплатные решения, такие как Let’s Encrypt.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как каналы устроены в Go?

Каналы в Go — это механизмы для общения между горутинами, обеспечивающие безопасную передачу данных. Они позволяют передавать значения одного типа между горутинами, синхронизируя их выполнение. Каналы могут быть буферизованными (с определенным размером буфера) и небуферизованными (синхронные). Операции записи и чтения из канала блокируются до тех пор, пока другая сторона не выполнит соответствующую операцию.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM